diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
new file mode 100644
index 0000000..8329e28
--- /dev/null
+++ b/.github/workflows/deploy.yml
@@ -0,0 +1,42 @@
+name: Deploy Conference Web site
+
+on:
+ push:
+ branches:
+ - master
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout source
+ uses: actions/checkout@v2
+ with:
+ path: main
+ - name: Setup node
+ uses: actions/setup-node@v1
+ with:
+ node-version: 10.x
+ - name: Install hexo dependencies
+ run: |
+ cd main
+ npm install
+ - name: Generate website
+ run: |
+ cd main
+ npm run generate
+ - name: Checkout gh-pages
+ uses: actions/checkout@v2
+ with:
+ path: gh-pages-pre
+ ref: gh-pages
+ fetch-depth: 0
+ - name: Publish to gh-pages
+ run: |
+ mv main/public gh-pages
+ cp -r gh-pages-pre/.git gh-pages/
+ cd gh-pages
+ git config --local user.email "bot@grusp.org"
+ git config --local user.name "Bot"
+ git add .
+ git commit -m "Auto Deploy at `date +"%Y-%m-%d %H:%M"`"
+ git push origin gh-pages
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..4ca96be
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,7 @@
+.DS_Store
+Thumbs.db
+db.json
+*.log
+node_modules
+public/
+.deploy*/
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000..2117f2d
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,32 @@
+image: node:12.18.3
+
+cache:
+ paths:
+ - node_modules/
+
+# created for initial tests; not used
+# deploy:
+# stage: deploy
+# before_script:
+# - npm install netlify-cli -g
+# - npm install
+# script:
+# - npx hexo clean && npx hexo g
+# - "LIVE_URL=$(netlify deploy --json --dir=public/ -s $NETLIFY_SITE_ID -a $NETLIFY_AUTH_TOKEN | grep -oP '(?<=\"deploy_url\": \")[^\"]*')"
+# - "curl -X POST -H 'Content-type: application/json' --data '{\"text\": \"$CI_PROJECT_NAME deployato con successo dal branch $CI_COMMIT_REF_NAME, $LIVE_URL\"}' $SLACK_WEBHOOK_URL"
+# only:
+# - branches
+# when: manual
+
+deploy_prod:
+ stage: deploy
+ before_script:
+ - npm install netlify-cli -g
+ - npm install
+ script:
+ - npm run generate
+ - "LIVE_URL=$(netlify deploy --json --prod --dir=public/ -s $NETLIFY_SITE_ID -a $NETLIFY_AUTH_TOKEN | grep -oP '(?<=\"url\": \")[^\"]*')"
+ - "curl -X POST $SLACK_WEBHOOK_URL -H 'Content-type: application/json' --data '{\"text\": \"Una nuova versione del sito è stata pubblicata con successo\"}'"
+ only:
+ refs:
+ - master
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..b6294d9
--- /dev/null
+++ b/README.md
@@ -0,0 +1,1792 @@
+# Hexo/Bulma Grusp Themes
+
+
+* [Installazione](#installazione)
+ * [Requirements](#requirements)
+ * [Setup](#setup)
+ * [Componenti aggiuntivi](#componenti-aggiuntivi)
+* [Informazioni generali](#informazioni-generali)
+ * [Generare il sito](#generare-il-sito)
+* [Configurazione](#configurazione)
+ * [Importante](#importante)
+ * [GitHub Pages](#github-pages)
+ * [Configurazione generale del sito](#configurazione-generale-del-sito)
+ * [Tema](#tema)
+ * [Configurazione generale del tema](#configurazione-generale-del-tema)
+* [Conferenze online](#conferenze-online)
+* [Contenuti](#contenuti)
+ * [Info base sulla conferenza](#info-base-sulla-conferenza)
+ * [Home page e componenti](#home-page-e-componenti)
+ * [Footer](#footer)
+ * [Welcome](#welcome)
+ * [Welcome/about](#welcomeabout)
+ * [Welcome/coc](#welcomecoc)
+ * [Welcome/scholarships](#welcomescholarships)
+ * [Welcome/where](#welcomewhere)
+ * [Welcome/cfp](#welcomecfp)
+ * [Talks](#talks)
+ * [Schedule](#schedule)
+ * [La logica](#la-logica)
+ * [Workshop](#workshop)
+ * [Sponsor](#sponsor)
+ * [Pagina "sponsor"](#pagina-sponsor)
+ * [Componente "sponsors"](#componente-sponsors)
+ * [Tickets](#tickets)
+
+
+## Installazione
+
+### Pre-requirements
+
+I prerequisiti all'installazione di Hexo sono:
+
+* node.js 12.18.3 (LTS)
+ * npm
+* git
+
+La [documentazione di Hexo](https://hexo.io/docs/) include le istruzioni per installare entrambi (Windows, Mac, Linux) e naturalmente le istruzioni per installare Hexo stesso.
+
+### Setup
+
+`npm install`
+
+## Componenti aggiuntivi
+
+Oltre al setup standard di Hexo sono stati aggiunti i seguenti plugins:
+
+* **Bulma** CSS framework
+* hexo-filter-responsive-images
+* hexo-render-pug
+* hexo-renderer-markdown-it-plus
+* hexo-renderer-sass
+* markdown-it
+* node-sass
+
+Essi vengono installati automaticamente dal setup come dipendenze.
+
+## Informazioni generali
+
+Il file di configurazione del sito si trova nella root directory del repo; i file di configurazione dei temi nelle rispettive directory (in `themes/[directory del tema]/`).
+
+Gli asset comuni (icone, immagini di sfondo delle testate, etc.) si trovano nei singoli temi.
+
+I contenuti (testi) invece si trovano in `/source/_data/`; gli asset specifici della singola conferenza (le foto degli speaker, i loghi dei partner, etc) si trovano in `/source/_data/img/`. Per i dettagli vedere [Contenuti](#contenuti).
+
+### Generare il sito
+
+Per generare il sito in locale:
+
+`npm run generate`
+
+Il comando svuota la directory `/public`, genera tutti i contenuti e li pubblica appunto in `/public`.
+
+Per testare in locale si può usare la funzionalità di Hexo che avvia un miniserver:
+
+`npm run server`
+
+La variante `watch` serve a lavorare sui contenuti senza dover riavviare continuamente il "server" di Hexo:
+
+`npm run watch`
+
+Il server ricarica dinamicamente i contenuti ogni volta che un file viene salvato. In questo modo si può lavorare sulla propria macchina con un'anteprima in tempo reale delle modifiche che si fanno. È necessario riavviare il server / rigenerare il sito solo se si fanno modifiche alla configurazione del tema o alla struttura dei template.
+
+## Configurazione
+
+### Importante
+
+Ci deve essere **almeno un post**, anche se vuoto, in `/source/_posts`, altrimenti **non viene generato l'`index` del sito**
+
+### GitHub Pages
+
+#### Build and deploy
+
+Il repository contiene lo script per la generazione del sito: `/.github/workflows/deploy.yml` che contiene le impostazioni per generare il sito e pubblicarlo su GitHub Pages.
+
+La "action" specificata nello script, che scatta quando si fa `push` su `master`, genera le pagine e gli assets e li pubblica in `gh-pages`.
+
+**Attenzione**: il file `CNAME` che specifica il dominio custom per GitHubPages deve essere incluso in `/source`, in modo che Hexo lo includa fra i file generati durante il deploy. Ovvero, in questo modo il file verrà copiato nel root directory di destinazione, e GitHub Pages potrà fare il redirect usando il dominio specificato.
+
+#### 404 page
+
+Quando si lavora in locale, la pagina 404 / Not Found viene generata, ma non utilizzata. Per utilizzarla sul server, seguire le [indicazioni fornite da GitHub](https://help.github.com/en/github/working-with-github-pages/creating-a-custom-404-page-for-your-github-pages-site).
+
+È sufficiente specificare `404.html` (la pagina viene generata nel root directory del sito).
+
+### Configurazione generale del sito
+
+La configurazione generale si trova nel file `_config.yml` nella root directory del repo.
+
+Qui si definiscono:
+
+* il **tema** (cfr. capitolo successivo "Tema")
+* i dati per schema.org e OpenGraph
+* la visualizzazione (o no) della *breadcrumbs* nelle pagine interne
+* l'URL del sito
+* i formati delle date
+* i parametri di configurazione standard di Hexo (separati da un commento "############# standard config: do not change")
+
+#### OpenGraph
+
+Tra i dati "interessanti" ci sono `title`, `description`, etc.; vengono usati per generare i microdata (json-ld) nelle varie pagine. vedere anche la [documentazione di Hexo](https://hexo.io/docs/configuration.html)
+
+```
+# Site / OG
+type: website
+title: "ruby day 2020"
+description: "Ruby Day 2020, Verona, Italy"
+# separate keywords by comma, no spaces
+keywords: conference,software conference,ruby,ruby on rails
+author: GrUSP
+language: en
+timezone: 'Europe/Rome'
+# si può sostituire con il logo della conferenza (`img/conference-logo.png`)
+image: 'img/grusp-logo-full.png'
+open_graph:
+ # si può sostituire con il logo della conferenza (`img/conference-logo.png`)
+ image: 'img/grusp-logo-full.png'
+```
+
+C'è anche la sezione dove inserire gli account social:
+
+```
+twitter:
+ twitter_id: rubydayIT
+fb:
+ fb_id: RubyDayIT
+```
+
+**NB** c'è una issue di Hexo per cui
+
+```
+open_graph:
+ image: 'img/grusp-logo-full.png'
+```
+
+a volte non viene interpretato correttamente, open_graph.js non genera tutti i tag `og:`, e in OpenGraph non risulta l'immagine. Stiamo monitorando la cosa...
+
+#### Breadcrumbs
+
+```
+# Breadcrumbs
+breadcrumb:
+ display: true
+```
+
+Basta cambiare `true` con `false` per nascondere le *breadcrumbs* in tutte le pagine
+
+#### URL del sito
+
+Es.: `url: https://grusp.isunder.review/` è il valore predefinito nel repo originale, ed è l'URL completo del sito di staging
+
+Viene usato per generare FQURLs dagli URI relativi.
+
+#### Formati data
+
+Usati sia nel frontend, sia per generare i valori dei tag `
devsecopsday si svolge a Bologna, Venerdì 13 Ottobre 2023. Si può partecipare in presenza oppure online.
+
• Dimostrare empatia e gentilezza verso le altre persone;
+
• Rispettare opinioni, punti di vista ed esperienze differenti;
+
• Dare e accettare con educazione feedback costruttivi;
+
• Accettare la responsabilità e chiedere scusa a chi ha subito i nostri errori e imparare dall’esperienza;
+
• Concentrarsi su ciò che è meglio non solo per noi come individui, ma per l’intera comunità.
+
"
+ content_4: "Esempi di comportamenti inaccettabili includono:
+
+
• L’uso di linguaggio o immagini sessualizzate, e l’attenzione sessuale o avances di qualsiasi tipo;
+
• Trolling, commenti offensivi o dispregiativi e attacchi personali o politici;
+
• Molestie pubbliche o private;
+
• Pubblicare informazioni private altrui, come un indirizzo fisico o e-mail, senza il loro esplicito permesso;
+
• Altri comportamenti che potrebbero ragionevolmente essere considerati inappropriati in un ambiente professionale.
+
• Commenti verbali offensivi relativi a sesso, orientamento sessuale, disabilità, aspetto fisico, corporatura, etnia, religione, immagini sessuali in spazi pubblici, intimidazioni intenzionali, stalking, inseguimenti, molestie fotografiche o registrazioni, interruzione prolungata di discorsi o altri eventi, contatto fisico inappropriato e attenzioni sessuali indesiderate.
+
"
+ content_5: "Responsabilità dell’applicazione Ogni membro del team GrUSP è responsabile di chiarire e far rispettare i nostri standard di comportamento accettabile ed è autorizzato a prendere azioni correttive appropriate ed eque in risposta a qualsiasi comportamento che viene ritenuto inappropriato, minaccioso, offensivo o dannoso.
+ Il team ha il diritto e la responsabilità di rimuovere, modificare o rifiutare commenti, problemi e altri contributi che non sono allineati a questo Codice di condotta e comunicheranno i motivi delle decisioni di moderazione quando appropriato."
+ content_6: "Per ulteriori dettagli sulle linee guida per l'applicazione e conseguenze relative alla violazione visita questa pagina.
+
+
+ Questo Codice di Comportamento è adattato dal Contributor Covenant, versione 2.0."
+ contact_info_title: "Sei testimone di una violazione o non ti senti a tuo agio per qualcosa che è successo durante la conferenza?"
+ contact_content_1: "Se ricevi molestie, se noti che qualche partecipante ne è oggetto o hai altri dubbi, contatta subito una persona del team GrUSP."
+ contact_content_2: ""
+ contact_content_3: "Negli eventi di persona, riconosci le persone del team perché indossano la maglietta gialla con logo GrUSP. Puoi anche contattare il personale della location e chiedere di essere messo in contatto con le persone responsabili della conferenza. Negli eventi online, puoi contattare lo staff organizzativo cercando le persone registrate come “nome – GrUSP Team”, oppure puoi contattarci inviando una mail a "
+ contact_content_4: ""
+ contact_content_5: "Puoi anche compilare il form anonimo che trovi a questa pagina."
\ No newline at end of file
diff --git a/source/_data/page_safety.yml b/source/_data/page_safety.yml
new file mode 100644
index 0000000..61209a5
--- /dev/null
+++ b/source/_data/page_safety.yml
@@ -0,0 +1,25 @@
+main_title: "Health and Safety Policy"
+content_1: " The health and safety of our attendees, speakers, sponsors, and staff is our top priority.
+ We are closely monitoring the COVID-19 situation and will follow the guidance of the Italian health officials.
+ We will keep this page updated with the latest regulations and recommendations."
+content_2: "phpday team will:
+
+
• Monitor the latest official guidelines and adjust our policy as needed;
+
• Provide masks for those that want or need them.
+
+"
+content_3: "phpday team recommends that all attendees:
+
+
• Being fully vaccinated including boosters before arrival;
+
• Getting tested before and during the event.
+
+ Please do not attend the conference if you feel sick or have been in close contact with someone who has been sick prior to the conference.
+"
+content_4: "Useful links:
+
+"
+content_5: "For more information or questions, please send an email to: "
+content_6: 'This page was freely adapted from php[tek]''s own policy. Thank you!'
diff --git a/source/_data/page_scholarships.yml b/source/_data/page_scholarships.yml
new file mode 100644
index 0000000..71f787d
--- /dev/null
+++ b/source/_data/page_scholarships.yml
@@ -0,0 +1,25 @@
+intro:
+ main_title: "Scholarship / Borse di studio"
+ content_1: "La diversità e l'inclusività sono importanti"
+ content_2: "Di cosa si tratta"
+ content_3: "Il nostro scopo è quello di creare una conferenza accessibile e accogliente, dove persone di diversa provenienza possano incontrarsi, sentirsi sicure e libere di esprimersi. Vogliamo permettere a tutte le persone di partecipare alle nostre conferenze e promuovere una comunità inclusiva."
+short_version:
+ title:
+ content_1: "Siamo coinvolti in molti modi per costruire un ambiente migliore nel settore tecnologico, per tutti. Nel 2016 siamo diventati Diversity Sponsor della campagna The PHPDiversity Rainbow Elephpant campaign su Kickstarter quando il progetto sembrava sul punto di concludersi senza successo. Siamo molto orgogliosi che molti altri ci abbiano seguito e che il progetto abbia raggiunto il suo obiettivo. Nel 2019 abbiamo sponsorizzato e organizzato per la prima volta RailsGirls Verona, un workshop gratuito di coding per donne."
+ content_2: "Sappiamo bene che per alcune persone partecipare a una conferenza potrebbe essere difficile, a causa di circostanze personali o finanziarie. Per questo motivo offriamo biglietti scontati o gratuiti soprattutto a coloro che sono sottorappresentati ed emarginati nel settore tecnologico (donne, membri della comunità LGBTQIA+, persone con disabilità, minoranze o altri gruppi sottorappresentati) e a tutti coloro che altrimenti non sarebbero in grado di partecipare senza assistenza finanziaria."
+ content_3:
+ content_4:
+ content_5:
+ content_6:
+long_version:
+ title:
+ content_1: "Richiedi la tua borsa di studio"
+ content_2_beginning: "Chiunque può richiedere la borsa di studio "
+ content_2_link_label: "per un biglietto singolo per partecipare a devsecopsday"
+ content_2_link_url: "https://forms.gle/K7b38LbqVuAJ61MK9"
+ content_2_ending: " . Comunicheremo a tutti i candidati l'esito della loro domanda. Non copriamo le spese di viaggio o alloggio."
+ content_3: "Sponsor"
+ content_4: "Stiamo cercando 'diversity sponsor' per finanziare questo programma e consentire a GrUSP di offrire più borse di studio possibili! Se rappresenti un'azienda tecnologica che vuole dare un contributo alla comunità degli sviluppatori, contattaci!"
+ content_5: "Contatto"
+ content_6: "Se hai domande o dubbi non esitare a contattarci "
+diversity_sponsors_title: ""
diff --git a/source/_data/page_sponsor.yml b/source/_data/page_sponsor.yml
new file mode 100644
index 0000000..a8c2e2e
--- /dev/null
+++ b/source/_data/page_sponsor.yml
@@ -0,0 +1,154 @@
+intro:
+ slogan_1: "La tua attività è connessa alle pratiche DevSecOps?"
+ slogan_2: "Vuoi partecipare al successo della conferenza?"
+ content_1: "Ottima idea! Partecipa a questa unica opportunità in Italia facendo parte della nostra community ricevendo visibilità."
+ content_2: ""
+ content_3: ""
+block_2:
+ title: "Opzioni di sponsorship"
+ slogan: "Ottieni il massimo dalla tua partecipazione"
+ subtitle_1: "Hai idee o suggerimenti?"
+ content_1: "Contattaci per organizzare le opzioni più adatta alle tue esigenze o per condividere una brillante idea di sponsorizzazione."
+ subtitle_2: "Pacchetti di sponsorizzazione"
+ content_2: "Puoi scegliere tra uno dei seguenti pacchetti di sponsorizzazione. Scrivici se hai bisogno di ulteriori informazioni."
+# level description blocks:
+# If the numbered description is not there, the relevant section will not be displayed
+# Every block has its own background color based on the block number
+# description_1: dedicated sessions
+# description_2: normally, Access to opt-in attendees list
+# description_3: logo & rollup
+# description_4: stand
+# description_5: gadgets
+# description_6: free tickets
+# description_7: discounted tickets
+levels:
+ level_1:
+ name: Main
+ amount: 10000
+ vat_label: "(+ VAT 22%)"
+ available_slots: 1
+ description_1:
+ - "Talk (massimo 30 minuti, non sono accettati talk commerciali)"
+ - "Accesso alla lista dei partecipanti (che hanno dato consenso a condivisione dati)"
+ description_2:
+ - "Stand fisico - grande"
+ - "Booth virtuale - grande"
+ description_3:
+ - "Vostro rollup nella sala della conferenza fisica"
+ - "Logo nei rollup della conferenza"
+ - "Logo in sovraimpressione durante la diretta (a rotazione)"
+ description_4:
+ - "Possibilità di portare e distribuire i vostri gadget"
+ - "Banner nella digital swag bag"
+ description_5:
+ - "Logo nelle comunicazioni pre-evento"
+ - "Logo sul sito della conferenza"
+ - "Ringraziamenti in diretta durante apertura e chiusura dell'evento"
+ description_6:
+ - "5 biglietti free per l'evento di persona"
+ - "10 biglietti free per l'evento online"
+ level_2:
+ name: Diamond
+ amount: 5000
+ vat_label: "(+ VAT 22%)"
+ available_slots: 2
+ description_1:
+ - "Accesso alla lista dei partecipanti (che hanno dato consenso a condivisione dati)"
+ description_2:
+ - "Stand fisico - grande"
+ - "Booth virtuale - medio"
+ description_3:
+ - "Vostro rollup nella sala della conferenza fisica"
+ - "Logo nei rollup della conferenza"
+ - "Logo in sovraimpressione durante la diretta (a rotazione)"
+ description_4:
+ - "Possibilità di portare e distribuire i vostri gadget"
+ - "Banner nella digital swag bag"
+ description_5:
+ - "Logo nelle comunicazioni pre-evento"
+ - "Logo sul sito della conferenza"
+ - "Ringraziamenti in diretta durante apertura e chiusura dell'evento"
+ description_6:
+ - "4 biglietti free per l'evento di persona"
+ - "8 biglietti free per l'evento online"
+ level_3:
+ name: Platinum
+ amount: 3000
+ vat_label: "(+ VAT 22%)"
+ available_slots: 4
+ description_2:
+ - "Stand fisico - piccolo"
+ - "Booth virtuale - piccolo"
+ description_3:
+ - "Vostro rollup nella sala della conferenza fisica"
+ - "Logo nei rollup della conferenza"
+ - "Logo in sovraimpressione durante la diretta (a rotazione)"
+ description_4:
+ - "Possibilità di portare e distribuire i vostri gadget"
+ - "Banner nella digital swag bag"
+ description_5:
+ - "Logo nelle comunicazioni pre-evento"
+ - "Logo sul sito della conferenza"
+ - "Ringraziamenti in diretta durante apertura e chiusura dell'evento"
+ description_6:
+ - "3 biglietti free per l'evento di persona"
+ - "6 biglietti free per l'evento online"
+ level_4:
+ name: Gold
+ amount: 1500
+ vat_label: "(+ VAT 22%)"
+ available_slots: 8
+ description_3:
+ - "Vostro rollup nella sala della conferenza fisica"
+ - "Logo nei rollup della conferenza"
+ - "Logo in sovraimpressione durante la diretta (a rotazione)"
+ description_4:
+ - "Possibilità di portare e distribuire i vostri gadget"
+ - "Banner nella digital swag bag"
+ description_5:
+ - "Logo nelle comunicazioni pre-evento"
+ - "Logo sul sito della conferenza"
+ - "Ringraziamenti in diretta durante apertura e chiusura dell'evento"
+ description_6:
+ - "2 biglietti free per l'evento di persona"
+ - "5 biglietti free per l'evento online"
+ level_5:
+ name: Silver
+ amount: 750
+ vat_label: "(+ VAT 22%)"
+ available_slots: 16
+ description_3:
+ - "Logo nei rollup della conferenza"
+ - "Logo in sovraimpressione durante la diretta (a rotazione)"
+ description_4:
+ - "Possibilità di portare e distribuire i vostri gadget"
+ - "Banner nella digital swag bag"
+ description_5:
+ - "Logo nelle comunicazioni pre-evento"
+ - "Logo sul sito della conferenza"
+ - "Ringraziamenti in diretta durante apertura e chiusura dell'evento"
+ description_6:
+ - "1 biglietto free per l'evento di persona"
+ - "4 biglietti free per l'evento online"
+ level_6:
+ name: Bronze
+ amount: 500
+ vat_label: "(+ VAT 22%)"
+ available_slots: 32
+ description_5:
+ - "Logo nelle comunicazioni pre-evento"
+ - "Logo sul sito della conferenza"
+ - "Ringraziamenti in diretta durante apertura e chiusura dell'evento"
+ description_6:
+ - "2 biglietti free per l'evento online"
+ level_7:
+ name: Diversity
+ amount: 500
+ vat_label: "(+ VAT 22%)"
+ available_slots: 32
+ description_5:
+ - "Logo nelle comunicazioni pre-evento"
+ - "Logo sul sito della conferenza"
+ - "Ringraziamenti in diretta durante apertura e chiusura dell'evento"
+ description_6:
+ - "2 biglietti free per l'evento online"
\ No newline at end of file
diff --git a/source/_data/page_welcome.yml b/source/_data/page_welcome.yml
new file mode 100644
index 0000000..64f7e87
--- /dev/null
+++ b/source/_data/page_welcome.yml
@@ -0,0 +1,30 @@
+intro:
+ main_title: "Welcome"
+ content_1: ""
+ content_2: "L'obiettivo dell'evento è consentire alla community di incontrarsi e condividere esperienze divertendosi e facendo rete in un contesto piacevole."
+# this is the global "read more" label
+readmore_label: "Leggi tutto"
+# these are the title and descriptions of the 6 blocks
+info_about:
+ title: "About"
+ content: "GrUSP ed il team dietro al devsecopsday"
+info_coc:
+ title: "COC"
+ content: "Regole di comportamento"
+info_safety:
+ title: "Salute pubblica"
+ content: "La salute di tutti è una nostra priorità"
+info_scholarships:
+ title: "Scholarship"
+ content: "Come richiedere un biglietto gratuito"
+info_cfp:
+ title: "CFP"
+ content: "Presenta un talk"
+info_venue:
+ title: "Dove"
+ content: "Informazioni utili"
+info_ticket:
+ title: "Biglietti"
+ content: "I biglietti sono disponibili su Tito"
+ # the tickets link is the only one that does not use the "global" label
+ readmore_label: "ACQUISTA"
diff --git a/source/_data/page_where.yml b/source/_data/page_where.yml
new file mode 100644
index 0000000..cd62471
--- /dev/null
+++ b/source/_data/page_where.yml
@@ -0,0 +1,38 @@
+header:
+ title_pre: "Ci vediamo a"
+intro:
+ main_title: "Conferenza ibrida: in presenza e online"
+ content_1: "La conferenza si svolge di persona a Bologna ed è anche possibile partecipare da remoto."
+ content_2: ""
+city_info:
+ title: "Come funziona"
+ subtitle_1: "La venue fisica"
+ description_1: "L'accesso all'evento fisico sarà subordinato alle eventuali normative vigenti."
+ subtitle_2: "La venue virtuale"
+ description_2: "Sarà anche possibile partecipare solo da remoto, acquistando il relativo biglietto. L'evento online si svolge su una piattaforma che permette di interagire con speaker e pubblico, e visitare gli stand degli sponsor."
+map:
+ title: "Dove siamo"
+ map_url: "https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d2845.258545295926!2d11.38279581512847!3d44.509857404631944!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x477e2ca643db29ab%3A0x19c877e26a7b7526!2sHotel%20Savoia%20Regency!5e0!3m2!1sit!2sit!4v1638894573435!5m2!1sit!2sit"
+ video_caption: ""
+hotels:
+ title: "La location dell'evento"
+ intro: "La venue è facilmente raggiungibile con i mezzi pubblici dalla Stazione ferrioviaria di Bologna. Se vieni in auto, troverai spazio per parcheggiare."
+ agreements:
+ hotel_1:
+ name: "Hotel Savoia Regency"
+ address: "Via del Pilastro, 2, 40127 Bologna BO"
+ website: "https://www.savoia.eu/"
+ maps_url: "https://goo.gl/maps/KmKU5YsBGjZihnkTA"
+ phone: ""
+ phone_label: ""
+ email: ""
+ # hotel_2:
+ # name: ""
+ # address: ""
+ # maps_url: ""
+ # phone: ""
+ # phone_label: ""
+address_aria_label: "hotel address"
+email_aria_label: "hotel email"
+phone_aria_label: "hotel phone"
+website_aria_label: "hotel phone"
diff --git a/source/_data/sponsors.yml b/source/_data/sponsors.yml
new file mode 100644
index 0000000..4cc0f83
--- /dev/null
+++ b/source/_data/sponsors.yml
@@ -0,0 +1,49 @@
+sponsors_block_title: ""
+# main:
+# sponsor1:
+# name: ""
+# logo_filename: ""
+# site_url: ""
+# diamond:
+# sponsor1:
+# name: ""
+# logo_filename: ""
+# site_url: ""
+# platinum:
+# sponsor1:
+# name: ""
+# logo_filename: ""
+# site_url: ""
+gold:
+ sponsor1:
+ name: "workwave"
+ logo_filename: "workwave.svg"
+ site_url: "https://www.workwave.com/"
+silver:
+ sponsor0:
+ name: "Daruma"
+ logo_filename: "daruma.svg"
+ site_url: "http://www.darumahq.com/"
+ sponsor4:
+ name: "Madisoft"
+ logo_filename: "madisoft.svg"
+ site_url: "https://labs.madisoft.it"
+ sponsor6:
+ name: "SiteGround"
+ logo_filename: "siteground.png"
+ site_url: "https://www.siteground.com/"
+bronze:
+ sponsor2:
+ name: "stickermule"
+ logo_filename: "stickermule.svg"
+ site_url: "https://mule.to/p2gc"
+# diversity:
+# sponsor1:
+# name: "S"
+# logo_filename: ""
+# site_url: ""
+
+# Partner configuration
+partner_tags:
+ - css
+ - frontend
diff --git a/source/_data/talks_speakers.yml b/source/_data/talks_speakers.yml
new file mode 100644
index 0000000..9de128e
--- /dev/null
+++ b/source/_data/talks_speakers.yml
@@ -0,0 +1,85 @@
+# NB impostare a `true` per generare la pagina, a `false` per NON generarla
+generate_schedule_page: true
+schedule_under_construction_title: "Schedule under construction"
+schedule_under_construction_description: "We are still defining the schedule. Please be patient"
+
+# Speakers. I mixin "&nome" servono per indicare quali speaker partecipano a ogni talk, sotto
+speaker_1: &speaker
+ speaker_in_speaker_lists: false
+ speaker_name:
+ speaker_pic_filename: .jpg
+ speaker_role: ""
+ speaker_bio: ""
+ speaker_github_url: ""
+ speaker_twitter_url: ""
+ speaker_instagram_url: ""
+ speaker_linkedin_url: ""
+ speaker_mastodon_url: ""
+ is_mc: false
+
+speakers:
+ speaker_1: *speaker
+
+tracks:
+ track_1: &track_1
+ id: 1
+ title: "Track 1"
+ track_2: &track_2
+ id: 2
+ title: "Track 2"
+ track_3: &track_3
+ id: 3
+ title: "Track 3 - fake track"
+
+# NB "item_type": tipi di "talk"
+# "talk" -- un talk vero e proprio, che va anche in components/speakers e nella pagina talks_speakers
+# "service" -- coffee break, lunch break, etc
+# "keynote" -- **non** viene messo in components/speakers e nella pagina talks_speakers
+# "workshop" -- sessione straordinaria (non workshop full-day), x es community workshop / UG
+# "other" -- altro; si inseriranno solo ora, titolo, descrizione facoltativa
+# NB tutti i "talk" devono avere una track. I "service" e i "keynote" dovrebbero avere track_1
+
+days:
+ day_1:
+ date: 2020-09-16T09:00
+ title: "Day 1"
+ talks:
+ talk_1:
+ item_type: "service"
+ start_datetime: 2020-09-16T09:00
+ end_datetime: 2020-09-16T09:30
+ talk_title: "Check-in"
+ talk_2:
+ item_type: "service"
+ start_datetime: 2022-05-19T13:00+02:00
+ end_datetime: 2022-05-19T14:30+02:00
+ talk_title: "Lunch break"
+ service_icon: "cutlery"
+ happy-hour:
+ item_type: "service"
+ start_datetime: 2022-05-19T18:25+02:00
+ end_datetime: 2022-05-19T19:30+02:00
+ talk_title: "Happy Hour"
+ service_icon: "glass"
+
+ # talk
+ keynote:
+ item_type: "keynote"
+ track: *track_1
+ start_datetime: 2022-05-19T09:30+02:00
+ end_datetime: 2022-05-19T10:25+02:00
+ talk_title: ""
+ talk_description: ""
+ talk_video_url:
+ speakers:
+ speaker_1: *speaker
+ titolotalk1:
+ item_type: "talk"
+ track: *track_1
+ start_datetime: 2022-05-19T10:25+02:00
+ end_datetime: 2022-05-19T11:05+02:00
+ talk_title: ""
+ talk_description: ""
+ talk_video_url:
+ speakers:
+ speaker_1: *speaker
diff --git a/source/_data/workshop.yml b/source/_data/workshop.yml
new file mode 100644
index 0000000..28d0e3a
--- /dev/null
+++ b/source/_data/workshop.yml
@@ -0,0 +1,101 @@
+read_more_label: "Maggiori informazioni"
+summary_page_aria_label: "workshop"
+summary_page_button_label: "Torna alla pagina workshop"
+# image credits (l'esempio è per la hero del CSS Day!)
+workshop_img_credits:
+
+workshops:
+ font_variabili:
+ ws_id: font_variabili
+ is_external: false
+ page_uri: "workshop/font_variabili.html"
+ page_title: "Tipografia web e font variabili"
+ workshop_title: "Tipografia web e font variabili"
+ ticket_url: "https://devsecopsday-2021.eventbrite.com"
+ ticket_label: "Partecipa"
+ location_title: "Dove"
+ # location: "Verona"
+ online_location: "online"
+ # location_name: "Hotel San Marco"
+ # location_name: "The Internet"
+ # location_contact_phone: "+045569011"
+ # location_contact_email: "sanmarco@sanmarco.vr.it"
+ # location_contact_url: "https://www.sanmarco.vr.it/"
+ # location_address: "Via Longhena 42, 37138 Verona (VE) Italy"
+ # location_maps_url: "https://www.google.com/maps/place/Hotel+San+Marco+Fitness+Pool+%26+SPA/@45.4399961,10.9697441,17z/data=!3m1!4b1!4m8!3m7!1s0x4781e1e30a8be6af:0x8091b108e1d130c6!5m2!4m1!1i2!8m2!3d45.4399961!4d10.9719328"
+ # location_maps_label: "Get directions"
+ # location_additional_info: "L'hotel offre tariffe scontate ai partecipanti ai workshop, sia per camere singole sia per camere doppie."
+ location_additional_info: "Il workshop si svolge online, in aula virtuale"
+ whatandwhen_title: "Quando"
+ # whatandwhen_additional_info: "Registrazione, caffè e pranzo inclusi"
+ whatandwhen_additional_info: "8 ore, divise in due sessioni: Martedì 16 e Mercoledì 17 Marzo 2021, dalle 9 alle 13."
+ date: 2021-03-16 09:00
+ end_date: 2021-03-17 13:00
+ date_text:
+ language_title: "Lingua"
+ language: "italiano"
+ # language_ext: "Lingua: italiano"
+ language_additional_info: ""
+ # collab: "Workshop realizzato in collaborazione con Giulia Laco"
+ description: "Progettare un sistema tipografico per siti web sfruttando i vantaggi del formato OpenType 1.8"
+ description_long:
+ " Progettare un sistema tipografico per siti web sfruttando i vantaggi del formato OpenType 1.8
+
+ I font variabili rappresentano una grossa novità per la tipografia dei siti web e godono oggi di un buon supporto a livello dei browser. Il formato rappresenta inoltre un’opportunità di miglioramento delle performance dei web font e un sorprendente ampliamento delle possibilità tipografiche. I siti web sono strutture complesse in cui il testo compare con diverse funzioni: dal corpo del testo, ai titoli, ai menù di navigazione e non solo. Ogni parte merita un diverso trattamento tipografico per esaltare al contempo l'architettura del sito, la struttura di pagina e la natura stessa del contenuto. I font variabili sembrano proprio venirci in aiuto. Per sfruttarne appieno le potenzialità, occorre capirne le ragioni storiche e immaginarne l’utilizzo creativo nelle interfacce digitali, nell’animazione del testo, nel design fluido, fino all’espressione del brand in modi nuovi, prima impensabili.
+
+ Nel workshop verranno affrontati sia aspetti teorici che pratici.
+
+ Cosa ottieni frequentando questo workshop:
+
+
• Conoscenza del formato dei font variabili e collocazione nella storia tipografica
+
• Capacità di corretta implementazione dei font variabili e dei fallback font con consapevolezza delle tematiche legate al web font loading
+
• Consapevolezza di cosa si acquista quando si compera un font
+
• Spunti per la creatività in base a ciò che un dato font prevede
+
+ "
+ # video trailer?
+ trailer: false
+ trailer_url: "https://player.vimeo.com/video/352012164"
+ # nota sul titolo: se il linguaggio specificato in `language` NON in clude 'italian', in pagina viene aggiunta la "s" finale
+ teacher_title: "Docente"
+ teachers:
+ teacher_1:
+ teacher_name: "Giulia Laco"
+ teacher_bio: "Formazione umanistica mescolata alla Logica matematica, la Linguistica, l’Intelligenza Artificiale e la Filosofia del Linguaggio.
+ Attratta dal Web design fin dagli esordi, sono stata webmaster in azienda nell’altro secolo e Web designer/developer in questo, appassionandomi ciclicamente a nuove discipline: Web Marketing, Architettura dell’Informazione, SEO, UX e Web Typography – per citarne alcune.
+ Da qualche anno cerco di ispirare la comunità dei web designer all’utilizzo consapevole della tipografia per il web."
+ pic_filename: "giulia-laco.jpg"
+ teacher_role: "Web designer/developer"
+ teacher_org: "WebMatter"
+ # teacher_2:
+ # teacher_name: ""
+ # teacher_bio: ""
+ # pic_filename: ""
+ # teacher_role: ""
+ # teacher_org: ""
+ topics_title: "Argomenti trattati"
+ topics:
+ - "Web font, font di sistema, UI system font"
+ - "Formati di font"
+ - "Direttiva CSS @font-face"
+ - "Il caricamento dei font, FOIT/FOUT"
+ - "La proprietà font-display"
+ - "Fallback font e font-stack"
+ - "I font variabili"
+ - "Gli assi di variazione"
+ - "Proprietà CSS (basso livello vs. CSS4)"
+ - "Font-size (unità di misura)"
+ - "Responsive Web Typography vs. Fluid Web Typography"
+ - "Typesetting del paragrafo perfetto"
+ - "Anatomia dei caratteri"
+ - "Classificazione"
+ - "Font-pairing"
+ - "Testo e funzione"
+ addressees_title: "A chi è rivolto"
+ addressees_description: "Il corso è rivolto a designer, sviluppatori, product owner e manager che vogliano applicare font variabili e principi di tipografia al proprio prodotto o progetto."
+ requirements_title: "Requisiti di partecipazione"
+ requirements_description: "Per partecipare è necessaria una conoscenza base di CSS e HTML. Ti serviranno inoltre un editor di codice e il browser (consigliata: ultima versione di Firefox) Verranno suggeriti prima del corso eventuali altri strumenti/configurazioni utili."
+ useful_info_title: "Informazioni utili"
+ useful_info_description: "Il workshop si svolge online e dura 8 ore, divise in due mattine: Martedì 16 e Mercoledì 17 Marzo 2021, dalle 9 alle 13."
+ # CTA
+ cta_title: "Hurry up. There are only a few available places!"
diff --git a/source/_posts/test.md b/source/_posts/test.md
new file mode 100644
index 0000000..e1617f7
--- /dev/null
+++ b/source/_posts/test.md
@@ -0,0 +1,6 @@
+---
+title: test
+date: 2019-08-19 15:51:02
+tags:
+---
+
diff --git a/source/img/community/.gitkeep b/source/img/community/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/source/img/grusp-logo-full.svg b/source/img/grusp-logo-full.svg
new file mode 100644
index 0000000..08046bf
--- /dev/null
+++ b/source/img/grusp-logo-full.svg
@@ -0,0 +1,177 @@
+
+
+
diff --git a/source/img/grusp-logo-orig.svg b/source/img/grusp-logo-orig.svg
new file mode 100644
index 0000000..833cac5
--- /dev/null
+++ b/source/img/grusp-logo-orig.svg
@@ -0,0 +1,89 @@
+
+
+
+
diff --git a/source/img/logos/.gitkeep b/source/img/logos/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/source/img/logos/apropos.svg b/source/img/logos/apropos.svg
new file mode 100644
index 0000000..caa2d11
--- /dev/null
+++ b/source/img/logos/apropos.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/source/img/logos/daruma.svg b/source/img/logos/daruma.svg
new file mode 100644
index 0000000..4bce65a
--- /dev/null
+++ b/source/img/logos/daruma.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/source/img/logos/madisoft.svg b/source/img/logos/madisoft.svg
new file mode 100644
index 0000000..9c665df
--- /dev/null
+++ b/source/img/logos/madisoft.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/source/img/logos/siteground.png b/source/img/logos/siteground.png
new file mode 100644
index 0000000..75e30ae
Binary files /dev/null and b/source/img/logos/siteground.png differ
diff --git a/source/img/logos/stickermule.svg b/source/img/logos/stickermule.svg
new file mode 100644
index 0000000..8f15e51
--- /dev/null
+++ b/source/img/logos/stickermule.svg
@@ -0,0 +1,27 @@
+
+
diff --git a/source/img/logos/workwave.svg b/source/img/logos/workwave.svg
new file mode 100644
index 0000000..5225c39
--- /dev/null
+++ b/source/img/logos/workwave.svg
@@ -0,0 +1,113 @@
+
+
diff --git a/source/img/media/.gitkeep b/source/img/media/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/source/img/speakers/.gitkeep b/source/img/speakers/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/source/img/team/.gitkeep b/source/img/team/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/source/img/team/cesare_yellow.jpg b/source/img/team/cesare_yellow.jpg
new file mode 100644
index 0000000..89f8c5a
Binary files /dev/null and b/source/img/team/cesare_yellow.jpg differ
diff --git a/source/img/team/cirpo_yellow.jpg b/source/img/team/cirpo_yellow.jpg
new file mode 100644
index 0000000..122faf9
Binary files /dev/null and b/source/img/team/cirpo_yellow.jpg differ
diff --git a/source/img/team/cristina_yellow.jpg b/source/img/team/cristina_yellow.jpg
new file mode 100644
index 0000000..bd7b6c3
Binary files /dev/null and b/source/img/team/cristina_yellow.jpg differ
diff --git a/source/img/team/daniel_yellow.jpg b/source/img/team/daniel_yellow.jpg
new file mode 100644
index 0000000..0f72c6b
Binary files /dev/null and b/source/img/team/daniel_yellow.jpg differ
diff --git a/source/img/team/francesco_yellow.jpg b/source/img/team/francesco_yellow.jpg
new file mode 100644
index 0000000..ef99709
Binary files /dev/null and b/source/img/team/francesco_yellow.jpg differ
diff --git a/source/img/team/fullo_yellow.jpg b/source/img/team/fullo_yellow.jpg
new file mode 100644
index 0000000..74f40da
Binary files /dev/null and b/source/img/team/fullo_yellow.jpg differ
diff --git a/source/img/team/giorgio_yellow.jpg b/source/img/team/giorgio_yellow.jpg
new file mode 100644
index 0000000..81d8e92
Binary files /dev/null and b/source/img/team/giorgio_yellow.jpg differ
diff --git a/source/img/team/giovanna_yellow.jpg b/source/img/team/giovanna_yellow.jpg
new file mode 100644
index 0000000..d1b74de
Binary files /dev/null and b/source/img/team/giovanna_yellow.jpg differ
diff --git a/source/img/team/giulia_yellow.jpg b/source/img/team/giulia_yellow.jpg
new file mode 100644
index 0000000..c41de1e
Binary files /dev/null and b/source/img/team/giulia_yellow.jpg differ
diff --git a/source/img/team/lara_yellow.jpg b/source/img/team/lara_yellow.jpg
new file mode 100644
index 0000000..5d3874f
Binary files /dev/null and b/source/img/team/lara_yellow.jpg differ
diff --git a/source/img/team/matteo_yellow.jpg b/source/img/team/matteo_yellow.jpg
new file mode 100644
index 0000000..e270cef
Binary files /dev/null and b/source/img/team/matteo_yellow.jpg differ
diff --git a/source/img/ws_teachers/.gitkeep b/source/img/ws_teachers/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/source/robots.txt b/source/robots.txt
new file mode 100644
index 0000000..c2a49f4
--- /dev/null
+++ b/source/robots.txt
@@ -0,0 +1,2 @@
+User-agent: *
+Allow: /
diff --git a/source/schedule/index.md b/source/schedule/index.md
new file mode 100644
index 0000000..93064a0
--- /dev/null
+++ b/source/schedule/index.md
@@ -0,0 +1,5 @@
+---
+title: schedule
+date: 2020-03-25 14:13:16
+layout: schedule
+---
diff --git a/source/sponsor/index.md b/source/sponsor/index.md
new file mode 100644
index 0000000..09e0934
--- /dev/null
+++ b/source/sponsor/index.md
@@ -0,0 +1,5 @@
+---
+title: Sponsorizza
+date: 2020-03-11 12:53:10
+layout: sponsor
+---
diff --git a/source/talks_speakers/index.md b/source/talks_speakers/index.md
new file mode 100644
index 0000000..0e71f0c
--- /dev/null
+++ b/source/talks_speakers/index.md
@@ -0,0 +1,5 @@
+---
+title: talks & speakers
+date: 2020-03-19 10:43:56
+layout: talks_speakers
+---
diff --git a/source/tickets/index.md b/source/tickets/index.md
new file mode 100644
index 0000000..9522efe
--- /dev/null
+++ b/source/tickets/index.md
@@ -0,0 +1,5 @@
+---
+title: Biglietti
+date: 2023-12-09 17:47:10
+layout: tickets
+---
diff --git a/source/welcome/about/index.md b/source/welcome/about/index.md
new file mode 100644
index 0000000..cdcb886
--- /dev/null
+++ b/source/welcome/about/index.md
@@ -0,0 +1,9 @@
+---
+title: about
+date: 2020-04-15 13:27:00
+layout: about
+path: welcome/about
+permalink: welcome/about
+# Used to generate breadcrumbs
+parent: welcome
+---
diff --git a/source/welcome/cfp/index.md b/source/welcome/cfp/index.md
new file mode 100644
index 0000000..253901d
--- /dev/null
+++ b/source/welcome/cfp/index.md
@@ -0,0 +1,9 @@
+---
+title: call for papers
+date: 2020-04-15 13:27:00
+layout: page_cfp
+path: welcome/cfp
+permalink: welcome/cfp
+# Used to generate breadcrumbs
+parent: welcome
+---
diff --git a/source/welcome/coc/index.md b/source/welcome/coc/index.md
new file mode 100644
index 0000000..2948cbb
--- /dev/null
+++ b/source/welcome/coc/index.md
@@ -0,0 +1,9 @@
+---
+title: coc
+date: 2020-03-16 14:40:58
+layout: coc
+path: welcome/coc
+permalink: welcome/coc
+# Used to generate breadcrumbs
+parent: welcome
+---
diff --git a/source/welcome/index.md b/source/welcome/index.md
new file mode 100644
index 0000000..5b2c228
--- /dev/null
+++ b/source/welcome/index.md
@@ -0,0 +1,5 @@
+---
+title: welcome
+date: 2020-03-23 14:06:55
+layout: welcome
+---
diff --git a/source/welcome/safety/index.md b/source/welcome/safety/index.md
new file mode 100644
index 0000000..9ac1b5c
--- /dev/null
+++ b/source/welcome/safety/index.md
@@ -0,0 +1,9 @@
+---
+title: health and safety
+date: 2024-01-03 11:12:00
+layout: safety
+path: welcome/safety
+permalink: welcome/safety
+# Used to generate breadcrumbs
+parent: welcome
+---
diff --git a/source/welcome/scholarships/index.md b/source/welcome/scholarships/index.md
new file mode 100644
index 0000000..ae642d9
--- /dev/null
+++ b/source/welcome/scholarships/index.md
@@ -0,0 +1,9 @@
+---
+title: scholarships
+date: 2020-03-19 15:12:00
+layout: scholarships
+path: welcome/scholarships
+permalink: welcome/scholarships
+# Used to generate breadcrumbs
+parent: welcome
+---
diff --git a/source/welcome/where/index.md b/source/welcome/where/index.md
new file mode 100644
index 0000000..f02335e
--- /dev/null
+++ b/source/welcome/where/index.md
@@ -0,0 +1,9 @@
+---
+title: where
+date: 2020-04-15 13:27:00
+layout: where
+path: welcome/where
+permalink: welcome/where
+# Used to generate breadcrumbs
+parent: welcome
+---
diff --git a/source/workshop/index.md b/source/workshop/index.md
new file mode 100644
index 0000000..5959fdc
--- /dev/null
+++ b/source/workshop/index.md
@@ -0,0 +1,5 @@
+---
+title: workshop
+date: 2020-04-07 14:11:15
+layout: page_workshops
+---
diff --git a/source/workshop/workshop_1/index.md b/source/workshop/workshop_1/index.md
new file mode 100644
index 0000000..cffeb7c
--- /dev/null
+++ b/source/workshop/workshop_1/index.md
@@ -0,0 +1,10 @@
+---
+title: Tipografia web e font variabili
+date: 2020-04-21 09:27:00
+layout: workshop_single
+ws_id: font_variabili
+path: workshop/font_variabili
+permalink: workshop/font_variabili
+# Used to generate breadcrumbs
+parent: workshop
+---
diff --git a/source/workshop/workshop_2/index.md b/source/workshop/workshop_2/index.md
new file mode 100644
index 0000000..81c9302
--- /dev/null
+++ b/source/workshop/workshop_2/index.md
@@ -0,0 +1,10 @@
+---
+title: another workshop
+date: 2020-04-21 09:27:00
+layout: workshop_single
+ws_id: workshop_2
+path: workshop/workshop_2
+permalink: workshop/workshop_2
+# Used to generate breadcrumbs
+parent: workshop
+---
diff --git a/themes/grusp_conf/_config.yml b/themes/grusp_conf/_config.yml
new file mode 100644
index 0000000..1fba923
--- /dev/null
+++ b/themes/grusp_conf/_config.yml
@@ -0,0 +1,37 @@
+basedir: /
+
+# html lang
+language: "en"
+
+# main menu navigation
+menu:
+ welcome: welcome
+ # talks_speakers: talk e speaker
+ # scommentare per generare pagina
+ # schedule: schedule
+ # menu item for workshop
+ # workshop: workshop
+ sponsor: sponsor
+
+# workshops submenu (comment out if only one workshop: add items for multiple workshops)
+workshop_submenu:
+ workshop_1: rails and vue
+ workshop_2: sample second workshop
+
+# welcome submenu
+welcome_submenu:
+ about: about
+ coc: codice di condotta
+ safety: salute pubblica
+ scholarships: borse di studio
+ where: dove e come
+ # delete this row to take out of the menu
+ cfp: call for paper
+
+# stylesheets loaded in the
+stylesheets:
+ - /assets/css/global.css
+
+# scripts loaded in the end of the body / commented out to prevent errors in compiling layout.pug
+scripts:
+ - /assets/js/menu.js
diff --git a/themes/grusp_conf/layout/404.pug b/themes/grusp_conf/layout/404.pug
new file mode 100644
index 0000000..a1b92e4
--- /dev/null
+++ b/themes/grusp_conf/layout/404.pug
@@ -0,0 +1,14 @@
+extends includes/layout.pug
+
+block content
+ section(id="404")
+ .container.container_404
+ .inner
+ .columns
+ .column.centered
+ p.text_giant ?
+ .column
+ h1(role="heading" aria-level="1").is-title.is-1= page.title
+ != page.content
+ p
+ a(href="/" role="button" aria-label="back to home page").button.is-primary.is-large.is-rounded !{site.data.defaults.conference.back_to_home_label}
diff --git a/themes/grusp_conf/layout/about.pug b/themes/grusp_conf/layout/about.pug
new file mode 100644
index 0000000..df0fa77
--- /dev/null
+++ b/themes/grusp_conf/layout/about.pug
@@ -0,0 +1,54 @@
+extends includes/layout.pug
+
+block content
+ - contact_url = "mailto:" + site.data.defaults.conference.contact_email
+ section(id="about")
+ include includes/_breadcrumbs.pug
+
+ .container
+ .inner
+ .title-container
+ include ../source/assets/ico/ico-about.svg
+ h1(role="heading" aria-level="1").is-title-is-1 !{site.data.page_about.intro.main_title}
+ p !{site.data.page_about.intro.content_1}
+ p !{site.data.page_about.intro.content_2}
+ if(site.data.page_about.more)
+ .container.container__more
+ .inner
+ h2(role="heading" aria-level="2").is-title.is-2 !{site.data.page_about.more.title}
+ if(site.data.page_about.more.content_1)
+ p !{site.data.page_about.more.content_1}
+ if(site.data.page_about.more.content_2)
+ p !{site.data.page_about.more.content_2}
+ if(site.data.page_about.past_edition)
+ .container.container__past-editions
+ .inner
+ h3(role="heading" aria-level="3").is-title.is-3 !{site.data.page_about.past_edition.video_caption}
+ .iframe-container
+ .iframe-holder
+ iframe(type="text/html" src=site.data.page_about.past_edition.video_url frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen width="800px" height="450px")
+ h3(role="heading" aria-level="3").is-title.is-3 !{site.data.page_about.past_edition.title}
+ each item in site.data.defaults.conference.past_editions
+ - url = "https://" + item + "." + site.data.defaults.conference.base_url
+ a(href=url target="_blank" rel="noopener noreferrer").past-edition !{item}
+ .container.container__team
+ .inner
+ h3(role="heading" aria-level="3").is-title.is-3 !{site.data.page_about.team.title}
+ p !{site.data.page_about.team.intro}
+ .columns.is-centered.inner
+ each tm in site.data.page_about.team.members
+ - filename = `/img/team/${tm.pic_filename}`
+ .column
+ .card
+ .card-image
+ img(src=filename role="figure" aria-label=tm.name)
+ .card-content
+ p.title !{tm.name}
+ p.subtitle
+ em !{tm.role}
+ //- imported components
+ include components/newsletter/newsletter
+ if(site.data.defaults.conference.sponsors_visible)
+ include components/sponsors/sponsors
+ if site.data.defaults.conference.community_partners
+ include components/community_partners/community_partners
diff --git a/themes/grusp_conf/layout/coc.pug b/themes/grusp_conf/layout/coc.pug
new file mode 100644
index 0000000..5930293
--- /dev/null
+++ b/themes/grusp_conf/layout/coc.pug
@@ -0,0 +1,61 @@
+extends includes/layout.pug
+
+block content
+ - contact_url = "mailto:" + site.data.defaults.conference.contact_email
+ section(id="coc")
+ include includes/_breadcrumbs.pug
+
+ .container
+ .inner
+ .title-container
+ include ../source/assets/ico/ico-coc.svg
+ h1(role="heading" aria-level="1").title-is-1 !{site.data.page_coc.intro.main_title}
+ p !{site.data.page_coc.intro.content_1}
+ p !{site.data.page_coc.intro.content_2}
+ .container.container__short-version
+ .inner
+ h2(role="heading" aria-level="2").title.is-2 !{site.data.page_coc.short_version.title}
+ p !{site.data.page_coc.short_version.content_1}
+ if(site.data.page_coc.short_version.content_2)
+ p !{site.data.page_coc.short_version.content_2}
+ if(site.data.page_coc.short_version.content_3)
+ p !{site.data.page_coc.short_version.content_3}
+ if(site.data.page_coc.short_version.content_4)
+ p !{site.data.page_coc.short_version.content_4}
+ if(site.data.page_coc.short_version.content_5)
+ p !{site.data.page_coc.short_version.content_5}
+ if(site.data.page_coc.short_version.content_6)
+ p !{site.data.page_coc.short_version.content_6}
+ .container.container__long-version
+ .inner
+ h2(role="heading" aria-level="2").title.is-2 !{site.data.page_coc.long_version.title}
+ p !{site.data.page_coc.long_version.content_1}
+ if(site.data.page_coc.long_version.content_2)
+ p !{site.data.page_coc.long_version.content_2}
+ if(site.data.page_coc.long_version.content_3)
+ p !{site.data.page_coc.long_version.content_3}
+ if(site.data.page_coc.long_version.content_4)
+ p !{site.data.page_coc.long_version.content_4}
+ if(site.data.page_coc.long_version.content_5)
+ p !{site.data.page_coc.long_version.content_5}
+ if(site.data.page_coc.long_version.content_6)
+ p !{site.data.page_coc.long_version.content_6}
+ .info-box
+ h2(role="heading" aria-level="2").title.is-2 !{site.data.page_coc.long_version.contact_info_title}
+ p !{site.data.page_coc.long_version.contact_content_1}
+ if(site.data.page_coc.long_version.contact_content_2)
+ p !{site.data.page_coc.long_version.contact_content_2}
+ if(site.data.page_coc.long_version.contact_content_3)
+ p !{site.data.page_coc.long_version.contact_content_3}
+ a(href=contact_url) !{site.data.defaults.conference.contact_email}
+ if(site.data.page_coc.long_version.contact_content_4)
+ p !{site.data.page_coc.long_version.contact_content_4}
+ if(site.data.page_coc.long_version.contact_content_5)
+ p !{site.data.page_coc.long_version.contact_content_5}
+
+ //- imported components
+ include components/newsletter/newsletter
+ if(site.data.defaults.conference.sponsors_visible)
+ include components/sponsors/sponsors
+ if site.data.defaults.conference.community_partners
+ include components/community_partners/community_partners
\ No newline at end of file
diff --git a/themes/grusp_conf/layout/components/cfp/cfp.pug b/themes/grusp_conf/layout/components/cfp/cfp.pug
new file mode 100644
index 0000000..6fd28ec
--- /dev/null
+++ b/themes/grusp_conf/layout/components/cfp/cfp.pug
@@ -0,0 +1,15 @@
+section(id="cfp").section_nopadding
+ .cfp__container
+ .columns.inner
+ .column
+ h1(role="heading" aria-level="2").title.is-1 !{site.data.defaults.conference.cfp_open_title}
+ .row-info
+
+ - var cfp_deadline = ""
+ if(site.data.defaults.conference.is_online_only === true)
+ - cfp_deadline = date(site.data.defaults.conference.cfp_deadline, config.date_format_hero_online)
+ else
+ - cfp_deadline = date(site.data.defaults.conference.cfp_deadline, config.date_format_hero)
+
+ span !{site.data.defaults.conference.cfp_open_label} #{cfp_deadline}
+ a(href=url_for("welcome/cfp.html") aria-label=site.data.defaults.conference.cfp_register_aria_label).button.is-medium.is-rounded.is-primary !{site.data.defaults.conference.cfp_readmore_label}
diff --git a/themes/grusp_conf/layout/components/cfp/cfp.sass b/themes/grusp_conf/layout/components/cfp/cfp.sass
new file mode 100644
index 0000000..a669f59
--- /dev/null
+++ b/themes/grusp_conf/layout/components/cfp/cfp.sass
@@ -0,0 +1,30 @@
+
+.cfp__container
+ background-color: $main-color
+ color: $main-text-color_inverted
+ h1
+ color: $main-text-color_inverted
+ font-size: 2em
+ +tablet
+ font-size: 3em
+ .inner
+ margin: 0 auto
+ align-items: center
+ text-align: center
+ padding: 1em 0
+ .row-info
+ display: inline-flex
+ flex-wrap: wrap
+ align-items: center
+ span
+ margin-right: 0
+ +tablet
+ margin-right: 1em
+ .button.is-primary
+ background-color: $main-text-color_inverted !important
+ color: $main-color
+ margin: 1em auto
+ &:hover, &:active, &:focus
+ background-color: $main-text-color !important
+ color: $main-text-color_inverted !important
+ border-color: $main-text-color_inverted !important
diff --git a/themes/grusp_conf/layout/components/community_partners/community_partners.pug b/themes/grusp_conf/layout/components/community_partners/community_partners.pug
new file mode 100644
index 0000000..4d156a4
--- /dev/null
+++ b/themes/grusp_conf/layout/components/community_partners/community_partners.pug
@@ -0,0 +1,5 @@
+section(id="hero__community_partners")
+ .container.community-partners-container
+ .inner
+ h2(role="heading" aria-level="2").is-title.is-2 !{site.data.defaults.conference.community_partners_title}
+ .columns.grusp_community_partners(data-name=config.slug data-tags=site.data.sponsors.partner_tags.join(' '))
diff --git a/themes/grusp_conf/layout/components/community_partners/community_partners.sass b/themes/grusp_conf/layout/components/community_partners/community_partners.sass
new file mode 100644
index 0000000..9f63350
--- /dev/null
+++ b/themes/grusp_conf/layout/components/community_partners/community_partners.sass
@@ -0,0 +1,19 @@
+.community-partners-container
+ h2
+ color: $main-color
+ font-size: 2em
+ font-style: normal
+ .inner
+ border: 8px solid $main-color_hue-medium !important
+ text-align: center
+ flex-flow: wrap
+ .columns
+ padding: 2em 0
+ justify-content: center
+ flex-flow: wrap
+ .column
+ margin: 0 1em
+ .column__community, .column__community img
+ min-width: 120px
+ max-width: 120px
+ display: inline-block
\ No newline at end of file
diff --git a/themes/grusp_conf/layout/components/generalinfo/generalinfo.pug b/themes/grusp_conf/layout/components/generalinfo/generalinfo.pug
new file mode 100644
index 0000000..668abf5
--- /dev/null
+++ b/themes/grusp_conf/layout/components/generalinfo/generalinfo.pug
@@ -0,0 +1,30 @@
+section(id="generalinfo").section_nopadding
+ .geninfo__container
+ .columns.inner
+ .column.geninfo-info
+ .row-info
+ h2(role="heading" aria-level="2").title.is-2 !{site.data.defaults.conference.geninfo_title}
+ p !{site.data.defaults.conference.geninfo_description}
+ include ../../includes/_social.pug
+ .column.geninfo-buttons
+ .geninfo-buttons__button-container
+ a(href="welcome/about.html" role="button")
+ .geninfo-buttons__button
+ include ../../../source/assets/ico/ico-about.svg
+ a(href="welcome/about.html" role="button" aria-label=site.data.defaults.conference.geninfo_about_label) !{site.data.defaults.conference.geninfo_about_label}
+ .geninfo-buttons__button-container
+ a(href="welcome/coc.html" role="button")
+ .geninfo-buttons__button
+ include ../../../source/assets/ico/ico-coc.svg
+ a(href="welcome/coc.html" role="button" aria-label=site.data.defaults.conference.geninfo_coc_label) !{site.data.defaults.conference.geninfo_coc_label}
+ if (site.data.defaults.conference.ticket_button_visible)
+ .geninfo-buttons__button-container
+ a(href="welcome/scholarships.html" role="button")
+ .geninfo-buttons__button
+ include ../../../source/assets/ico/ico-scholarship.svg
+ a(href="welcome/scholarships.html" role="button" aria-label=site.data.defaults.conference.geninfo_scholarships_label) !{site.data.defaults.conference.geninfo_scholarships_label}
+ .geninfo-buttons__button-container
+ a(href=url_for("tickets") role="button")
+ .geninfo-buttons__button
+ include ../../../source/assets/ico/ico-ticket.svg
+ a(href=url_for("tickets") role="button" aria-label=site.data.defaults.conference.geninfo_tickets_label) !{site.data.defaults.conference.geninfo_tickets_label}
diff --git a/themes/grusp_conf/layout/components/generalinfo/generalinfo.sass b/themes/grusp_conf/layout/components/generalinfo/generalinfo.sass
new file mode 100644
index 0000000..a80bff9
--- /dev/null
+++ b/themes/grusp_conf/layout/components/generalinfo/generalinfo.sass
@@ -0,0 +1,81 @@
+.geninfo__container
+ padding: 3em 0
+ margin: 0
+ .inner
+ margin: 0 auto
+ max-width: 1200px
+ h2
+ color: $main-color
+ font-style: normal
+
+.geninfo-info
+ display: flex
+ flex-direction: column
+ align-content: space-between
+ min-width: 240px
+ .row-info
+ flex-grow: 1
+ .row__social
+ font-size: .9em
+ font-weight: 700
+ padding: 1em 0
+ p
+ margin-bottom: 8px
+
+.social-icon
+ width: 40px
+ height: 40px
+ display: inline-flex
+ background-color: $main-color
+ border-radius: 20px
+ margin: 0 8px
+ border: 1px solid $main-color
+ svg
+ path, rect, ellipse, circle
+ fill: $main-text-color_inverted
+ &:hover, &:active, &:focus
+ background-color: $main-text-color_inverted
+ svg
+ path, rect, ellipse, circle
+ fill: $main-color
+
+.geninfo-buttons
+ display: flex
+ flex-wrap: wrap
+ justify-content: center
+ align-content: center
+ max-width: 80%
+ margin: 0 auto
+ +tablet
+ min-width: 450px
+
+.geninfo-buttons__button-container
+ min-width: 190px
+ height: 190px
+ margin: 10px
+ display: flex
+ flex-direction: column
+ align-items: center
+ align-content: center
+ justify-content: center
+ text-align: center
+ background-color: $main-color
+ border: 1px solid $main-color
+ &:hover, &:focus, &:active
+ background-color: $main-text-color_inverted
+ svg path, svg path, svg path
+ fill: $main-color
+ a
+ color: $main-text-color_inverted
+ text-transform: uppercase
+ font-size: .8em
+ font-weight: 600
+ &:hover > a, &:focus > a, &:active > a
+ color: $main-color
+ text-decoration: none
+
+.geninfo-buttons__button
+ width: 120px
+ height: 120px
+ svg path
+ fill: $main-text-color_inverted
diff --git a/themes/grusp_conf/layout/components/hero/hero.pug b/themes/grusp_conf/layout/components/hero/hero.pug
new file mode 100644
index 0000000..25df7dc
--- /dev/null
+++ b/themes/grusp_conf/layout/components/hero/hero.pug
@@ -0,0 +1,74 @@
+section(id="hero").section_nopadding
+
+ - classes = "hero__container"
+ if(site.data.defaults.conference.is_online_only === true)
+ - classes += " is-online-conference"
+
+ div(class=classes)
+ .columns.inner
+ .column
+ .row-info
+ .info-icon
+ if(site.data.defaults.conference.is_online_only === true)
+ include ../../../source/assets/ico/ico-online-conference.svg
+ else
+ include ../../../source/assets/ico/ico-where.svg
+
+ if(site.data.defaults.conference.is_online_only === true)
+ .info__location !{site.data.defaults.conference.online_location}
+ else
+ .info__location !{site.data.defaults.conference.city}
+ | |
+
+ .info-icon.padded
+ include ../../../source/assets/ico/ico-calendar.svg
+
+ - var start_date = ""
+ if(site.data.defaults.conference.hero_date_text)
+ - start_date = site.data.defaults.conference.hero_date_text
+ else if(site.data.defaults.conference.is_online_only === true)
+ - start_date = date(site.data.defaults.conference.date, config.date_format_hero_online)
+ else
+ - start_date = date(site.data.defaults.conference.date, config.date_format_hero)
+
+ .info__date
+ time(datetime=site.data.defaults.conference.date) !{start_date}
+ .row__title
+ h1(role="heading" aria-level="1").title.is-1 !{site.data.defaults.conference.title_pre} !{site.data.defaults.conference.title}
+ .row__more
+ .columns
+ .column.is-two-thirds
+ if(site.data.defaults.conference.countdown_visible)
+ .countdown-container(role="timer" id="countdown").is-hidden
+ .days-container
+ .days 00
+ .days-label !{site.data.defaults.conference.countdown_days}
+ .hours-container
+ .hours 00
+ .hours-label !{site.data.defaults.conference.countdown_hours}
+ .minutes-container
+ .minutes 00
+ .minutes-label !{site.data.defaults.conference.countdown_minutes}
+ .seconds-container
+ .seconds 00
+ .seconds-label !{site.data.defaults.conference.countdown_seconds}
+ script(type="text/javascript" src='/assets/js/layout/components/hero/hero.js')
+ script(type="text/javascript").
+ document.addEventListener("DOMContentLoaded", function(event) {
+ var a = `#{site.data.defaults.conference.date}`;
+ countDownClock(a);
+ });
+ script(type="text/javascript").
+ setTimeout(
+ function()
+ {
+ document.getElementById('countdown').classList.remove('is-hidden');
+ },
+ 1500);
+
+
+ .column
+ if(site.data.defaults.conference.ticket_button_visible)
+ a(href=url_for("tickets") role="button" aria-label=site.data.defaults.conference.hero_buy_tickets_label).button.is-large.is-rounded.is-primary !{site.data.defaults.conference.hero_buy_tickets_label}
+ if(site.data.defaults.conference.hero_img_credits)
+ .image-credits !{site.data.defaults.conference.hero_img_credits}
diff --git a/themes/grusp_conf/layout/components/hero/hero.sass b/themes/grusp_conf/layout/components/hero/hero.sass
new file mode 100644
index 0000000..e62f959
--- /dev/null
+++ b/themes/grusp_conf/layout/components/hero/hero.sass
@@ -0,0 +1,127 @@
+@import "bulma/sass/layout/hero"
+@import "bulma/sass/utilities/mixins"
+@import "bulma/sass/utilities/controls"
+@import "bulma/sass/elements/button"
+
+.hero__container
+ @extend .hero
+ flex-direction: row
+ width: 100vw
+ //- this is to avoid having `hero-head` and `hero-foot` (see bulma docs)
+ height: 100vh
+ background-image: url("/assets/img/hero/hero.jpg")
+ background-size: cover
+ background-repeat: no-repeat
+ background-position: center center
+ background-attachment: fixed
+ position: relative
+ +tablet
+ background-image: url("/assets/img/hero/tablet_hero.jpg")
+ +desktop
+ background-image: url("/assets/img/hero/desktop_hero.jpg")
+ +widescreen
+ background-image: url("/assets/img/hero/widescreen_hero.jpg")
+ +fullhd
+ background-image: url("/assets/img/hero/hero.jpg")
+ +tablet-vertical
+ background-image: url("/assets/img/hero/tablet_vertical_hero.jpg")
+ +medium-phone
+ background-image: url("/assets/img/hero/mobile_medium_hero.jpg")
+ +small-phone
+ background-image: url("/assets/img/hero/mobile_small_hero.jpg")
+ .inner
+ align-items: center
+ .row-info
+ display: flex
+ flex-direction: row
+ align-items: center
+ text-transform: uppercase
+ color: $main-text-color_inverted
+ font-size: .7em
+ +tablet
+ font-size: 1em
+ .info-icon
+ margin-top: 6px
+ .info-icon.padded
+ padding: 0 0 0 10px
+ +tablet
+ padding: 0 0 0 30px
+ svg
+ height: 30px
+ width: auto
+ path
+ fill: $main-text-color_inverted
+ .row__title
+ padding: 8em 0 4em
+ +tablet
+ padding: 1em 0
+ .row__title h1
+ text-transform: none
+ font-weight: 700
+ color: $main-text-color_inverted
+ font-size: 2.2em
+ line-height: 1.2
+ +tablet
+ font-size: 3em
+ line-height: 1.5
+ +widescreen
+ font-size: 4em
+ &.is-online-conference
+ background-image: url("/assets/img/hero/hero-online.jpg")
+ +tablet
+ background-image: url("/assets/img/hero/tablet_hero-online.jpg")
+ +desktop
+ background-image: url("/assets/img/hero/desktop_hero-online.jpg")
+ +widescreen
+ background-image: url("/assets/img/hero/widescreen_hero-online.jpg")
+ +fullhd
+ background-image: url("/assets/img/hero/hero-online.jpg")
+ +tablet-vertical
+ background-image: url("/assets/img/hero/tablet_vertical_hero-online.jpg")
+ +medium-phone
+ background-image: url("/assets/img/hero/mobile_medium_hero-online.jpg")
+ +small-phone
+ background-image: url("/assets/img/hero/mobile_small_hero-online.jpg")
+.info__location
+ padding: 0 30px 0 10px
+
+.info__date
+ padding: 0 0 0 10px
+
+.row__more
+ display: flex
+ justify-content: flex-start
+ .columns
+ width: 100%
+ flex-wrap: wrap
+
+.countdown-container
+ display: flex
+ justify-content: flex-start
+ .is-hidden
+ visibility: hidden
+.days-container, .hours-container, .minutes-container, .seconds-container
+ display: flex
+ flex-direction: column
+ align-items: flex-start
+ justify-content: flex-start
+ width: 120px
+ height: 120px
+
+.days, .hours, .minutes, .seconds
+ font-weight: 600
+ font-size: 2em
+ color: $main-color_hue-medium
+
+.days-label, .hours-label, .minutes-label, .seconds-label
+ font-size: .9em
+ color: $main-text-color_inverted
+
+.image-credits
+ position: relative
+ margin: -2em auto 0
+ text-align: center
+ font-size: .8em
+ color: $main-text-color_inverted
+ a
+ color: $main-text-color_inverted
\ No newline at end of file
diff --git a/themes/grusp_conf/layout/components/location/location.pug b/themes/grusp_conf/layout/components/location/location.pug
new file mode 100644
index 0000000..3ac5f13
--- /dev/null
+++ b/themes/grusp_conf/layout/components/location/location.pug
@@ -0,0 +1,50 @@
+section(id="location").section_nopadding
+ .location__container
+ .inner
+ .row-info
+ .info-icon
+
+ if(site.data.defaults.conference.is_online_only === true)
+ include ../../../source/assets/ico/ico-online-conference.svg
+ else
+ include ../../../source/assets/ico/ico-where.svg
+
+
+ if(site.data.defaults.conference.is_online_only === true)
+ .info__location !{site.data.defaults.conference.online_location}
+ else
+ .info__location !{site.data.defaults.conference.city}
+
+ if(site.data.defaults.conference.is_online_only === true)
+ //- .info__location !{site.data.defaults.conference.online_location}
+ h2(role="heading" aria-level="2").title.is-2 !{site.data.defaults.conference.online_location_title}
+ p
+ strong !{site.data.defaults.conference.online_location_info}
+ else
+ .info__location !{site.data.defaults.conference.city}
+ h2(role="heading" aria-level="2").title.is-2 !{site.data.defaults.conference.location_name}
+ p
+ strong !{site.data.defaults.conference.location_address}
+
+ a(href=url_for("welcome/where.html")).button.is-medium.is-rounded.is-primary !{site.data.defaults.conference.location_readmore_label}
+
+ if(site.data.defaults.conference.is_online_only === false)
+ a(href=site.data.defaults.conference.location_maps_url target="_blank" rel="noopener noreferrer").button.is-medium.is-rounded.is-primary !{site.data.defaults.conference.location_maps_label}
+
+ if(site.data.defaults.conference.venue_img_credits)
+ .image-credits !{site.data.defaults.conference.venue_img_credits}
+
+ //- schema.org microdata
+ script(type="application/ld+json").
+ {
+ "@type": "Place",
+ "address":
+ {
+ "@type": "PostalAddress",
+ "addressLocality": "#{site.data.defaults.conference.md_city}",
+ "addressRegion": "#{site.data.defaults.conference.md_province}",
+ "postalCode": "#{site.data.defaults.conference.md_postal_code}",
+ "streetAddress": "#{site.data.defaults.conference.md_address}"
+ },
+ "name": "#{site.data.defaults.conference.location_name}"
+ }
\ No newline at end of file
diff --git a/themes/grusp_conf/layout/components/location/location.sass b/themes/grusp_conf/layout/components/location/location.sass
new file mode 100644
index 0000000..01a80b3
--- /dev/null
+++ b/themes/grusp_conf/layout/components/location/location.sass
@@ -0,0 +1,72 @@
+.location__container
+ flex-direction: row
+ width: 100vw
+ background-image: url("/assets/img/venue/venue.jpg")
+ background-size: cover
+ background-repeat: no-repeat
+ background-position: center center
+ position: relative
+ padding: 3em 0
+ margin: 0
+ +tablet
+ background-image: url("/assets/img/venue/tablet_venue.jpg")
+ +desktop
+ background-image: url("/assets/img/venue/desktop_venue.jpg")
+ +widescreen
+ background-image: url("/assets/img/venue/widescreen_venue.jpg")
+ +fullhd
+ background-image: url("/assets/img/venue/venue.jpg")
+ +tablet-vertical
+ background-image: url("/assets/img/venue/tablet_vertical_venue.jpg")
+ +medium-phone
+ background-image: url("/assets/img/venue/mobile_medium_venue.jpg")
+ +small-phone
+ background-image: url("/assets/img/venue/mobile_small_venue.jpg")
+ .inner
+ align-items: center
+ margin: 0 auto
+ *
+ color: $main-text-color_inverted
+ h2
+ font-style: normal
+ font-size: 2.2em
+ line-height: 1.2
+ +tablet
+ font-size: 3em
+ line-height: 1.5
+ +widescreen
+ font-size: 4em
+ .row-info
+ color: $main-text-color_inverted
+ display: flex
+ flex-direction: row
+ align-items: center
+ text-transform: uppercase
+ .info-icon
+ margin-top: 6px
+ svg
+ height: 30px
+ width: auto
+ path
+ fill: $main-text-color_inverted
+ .info__location
+ padding: 0 30px 0 10px
+ .button.is-primary
+ background-color: $main-color
+ font-weight: 700
+ padding-left: 2em
+ padding-right: 2em
+ margin-top: 2em
+ margin-right: 2em
+ &:hover, &:active, &:focus
+ color: $main-color
+ background-color: $main-text-color_inverted
+
+.image-credits
+ position: relative
+ margin: -2em auto 0
+ text-align: center
+ font-size: .8em
+ color: $main-text-color_inverted
+ a
+ color: $main-text-color_inverted
\ No newline at end of file
diff --git a/themes/grusp_conf/layout/components/media/media.pug b/themes/grusp_conf/layout/components/media/media.pug
new file mode 100644
index 0000000..cf44712
--- /dev/null
+++ b/themes/grusp_conf/layout/components/media/media.pug
@@ -0,0 +1,34 @@
+section(id="media").section_nopadding
+ .media__container
+ .columns.is-mobile
+ if(site.data.defaults.conference.media_pic_1)
+ - pic_1_filename = `/img/media/${site.data.defaults.conference.media_pic_1}`
+ .column
+ .pic-holder
+ img(src=pic_1_filename alt="")
+ if(site.data.defaults.conference.media_pic_2)
+ - pic_2_filename = `/img/media/${site.data.defaults.conference.media_pic_2}`
+ .column
+ .pic-holder
+ img(src=pic_2_filename alt="")
+ if(site.data.defaults.conference.media_pic_3)
+ - pic_3_filename = `/img/media/${site.data.defaults.conference.media_pic_3}`
+ .column
+ .pic-holder
+ img(src=pic_3_filename alt="")
+ if(site.data.defaults.conference.media_pic_4)
+ - pic_4_filename = `/img/media/${site.data.defaults.conference.media_pic_4}`
+ .column
+ .pic-holder
+ img(src=pic_4_filename alt="")
+ if(site.data.defaults.conference.media_video_playlist)
+ - playlist_full_url= ""
+ if(site.data.defaults.conference.media_video_is_youtube)
+ - playlist_full_url = site.data.defaults.conference.youtube_base_url + site.data.defaults.conference.youtube_playlist_id
+ else
+ - playlist_full_url = site.data.defaults.conference.vimeo_base_url + site.data.defaults.conference.vimeo_showcase_id + site.data.defaults.conference.vimeo_url_suffix
+ .inner
+ h3(role="heading" aria-level="3").is-title.is-3 !{site.data.page_about.past_edition.video_caption}
+ .iframe-container
+ .iframe-holder
+ iframe(type="text/html" src=playlist_full_url frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen width="800px" height="450px")
diff --git a/themes/grusp_conf/layout/components/media/media.sass b/themes/grusp_conf/layout/components/media/media.sass
new file mode 100644
index 0000000..da4358e
--- /dev/null
+++ b/themes/grusp_conf/layout/components/media/media.sass
@@ -0,0 +1,39 @@
+.media__container
+ padding: 0 0 1em
+ margin: 0 auto
+ background-color: $main-text-color
+ text-align: center
+ h3
+ color: white
+ .column
+ padding: 0
+ margin: 0
+ max-width: 49%
+ +tablet
+ max-width: 25%
+ .pic-holder
+ overflow: hidden
+ height: 0
+ padding: 56.25% 0 0 0
+ position: relative
+ img
+ position: absolute
+ top: 0
+ left: 0
+ width: 100%
+ height: 100%
+ .iframe-container
+ max-width: 800px
+ margin: 0 auto
+ padding: 2em 0
+ .iframe-holder
+ overflow: hidden
+ height: 0
+ padding: 56.25% 0 0 0
+ position: relative
+ iframe
+ position: absolute
+ top: 0
+ left: 0
+ width: 100%
+ height: 100%
\ No newline at end of file
diff --git a/themes/grusp_conf/layout/components/newsletter/_mailchimp.pug b/themes/grusp_conf/layout/components/newsletter/_mailchimp.pug
new file mode 100644
index 0000000..f8fa5cd
--- /dev/null
+++ b/themes/grusp_conf/layout/components/newsletter/_mailchimp.pug
@@ -0,0 +1,125 @@
+#mc_embed_signup
+ form(action="https://grusp.us5.list-manage.com/subscribe/post?u=29d918424cd5375f4c0c54c00&id=204120a4eb" method="post" id="mc-embedded-subscribe-form" name="mc-embedded-subscribe-form" class="validate" target="_blank")
+ #mc_embed_signup_scroll
+ //- hidden
+ .indicates-required.is-hidden
+ span.asterisk *
+ | required
+ .columns.is-desktop
+ //- visible: email
+ .column.mc-field-group.inset-label
+ input(type="email" value="" name="EMAIL" id="mce-EMAIL" required title="The domain portion of the email address is invalid (the portion after the @)." pattern="^([^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+|\\x22([^\\x0d\\x22\\x5c\\x80-\\xff]|\\x5c[\\x00-\\x7f])*\\x22)(\\x2e([^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+|\\x22([^\\x0d\\x22\\x5c\\x80-\\xff]|\\x5c[\\x00-\\x7f])*\\x22))*\\x40([^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+|\\x5b([^\\x0d\\x5b-\\x5d\\x80-\\xff]|\\x5c[\\x00-\\x7f])*\\x5d)(\\x2e([^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+|\\x5b([^\\x0d\\x5b-\\x5d\\x80-\\xff]|\\x5c[\\x00-\\x7f])*\\x5d))*(\\.\\w{2,})+$").email
+ label(for="mce-EMAIL") !{site.data.defaults.conference.newsletter_email_label}
+ .column.mc-field-group.inset-label
+ input(type="text" value="" name="FNAME" class="" id="mce-FNAME")
+ label(for="mce-FNAME") !{site.data.defaults.conference.newsletter_firstname_label}
+ .column.mc-field-group.inset-label
+ input(type="text" value="" name="LNAME" class="" id="mce-LNAME")
+ label(for="mce-LNAME") !{site.data.defaults.conference.newsletter_lastname_label}
+ .columns
+ //- visible: accept privacy policy
+ .column.mc-field-group.input-group
+ - privacy_policy_url = site.data.defaults.conference.privacy_policy_url_common + site.data.defaults.conference.iubenda.cookiePolicyId
+ span !{site.data.defaults.conference.newsletter_privacy_label}
+ a(role="button" href=privacy_policy_url target="_blank" rel="external noopener noreferrer" aria-label=site.data.defaults.conference.newsletter_privacy_link_label) !{site.data.defaults.conference.newsletter_privacy_link_label}
+ ul
+ li
+ label(for="mce-MMERGE11-0")
+ input(type="checkbox" value="Yes" name="MMERGE11" id="mce-MMERGE11-0" required)
+ //- hidden: list(s) to subscribe -- configura in site.defaults
+ .mc-field-group.input-group.is-hidden
+ ul
+ li
+ if(site.data.defaults.conference.newsletter_lists.php)
+ input(type="checkbox" value="2" name="group[13285][2]" id="mce-group[13285]-13285-0" checked)
+ else
+ label(for="mce-group[13285]-13285-0") php
+ li
+ if(site.data.defaults.conference.newsletter_lists.javascript)
+ input(type="checkbox" value="4" name="group[13285][4]" id="mce-group[13285]-13285-1" checked)
+ else
+ input(type="checkbox" value="4" name="group[13285][4]" id="mce-group[13285]-13285-1")
+ label(for="mce-group[13285]-13285-1") javascript
+ li
+ if(site.data.defaults.conference.newsletter_lists.design)
+ input(type="checkbox" value="8" name="group[13285][8]" id="mce-group[13285]-13285-2" checked)
+ else
+ input(type="checkbox" value="8" name="group[13285][8]" id="mce-group[13285]-13285-2")
+ label(for="mce-group[13285]-13285-2") design
+ li
+ if(site.data.defaults.conference.newsletter_lists.devops)
+ input(type="checkbox" value="16" name="group[13285][16]" id="mce-group[13285]-13285-3" checked)
+ else
+ input(type="checkbox" value="16" name="group[13285][16]" id="mce-group[13285]-13285-3")
+ label(for="mce-group[13285]-13285-3") devops
+ li
+ if(site.data.defaults.conference.newsletter_lists.frontend)
+ input(type="checkbox" value="32" name="group[13285][32]" id="mce-group[13285]-13285-4" checked)
+ else
+ input(type="checkbox" value="32" name="group[13285][32]" id="mce-group[13285]-13285-4")
+ label(for="mce-group[13285]-13285-4") frontend
+ li
+ if(site.data.defaults.conference.newsletter_lists.ruby)
+ input(type="checkbox" value="512" name="group[13285][512]" id="mce-group[13285]-13285-5" checked)
+ else
+ input(type="checkbox" value="512" name="group[13285][512]" id="mce-group[13285]-13285-5")
+ label(for="mce-group[13285]-13285-5") ruby
+ li
+ if(site.data.defaults.conference.newsletter_lists.entrepreneurship)
+ input(type="checkbox" value="256" name="group[13285][256]" id="mce-group[13285]-13285-6" checked)
+ else
+ input(type="checkbox" value="256" name="group[13285][256]" id="mce-group[13285]-13285-6")
+ label(for="mce-group[13285]-13285-6") entrepreneurship
+ li
+ if(site.data.defaults.conference.newsletter_lists.local_events)
+ input(type="checkbox" value="64" name="group[13285][64]" id="mce-group[13285]-13285-7" checked)
+ else
+ input(type="checkbox" value="64" name="group[13285][64]" id="mce-group[13285]-13285-7")
+ label(for="mce-group[13285]-13285-7") local_events
+ li
+ if(site.data.defaults.conference.newsletter_lists.everything)
+ input(type="checkbox" value="128" name="group[13285][128]" id="mce-group[13285]-13285-8" checked)
+ else
+ input(type="checkbox" value="128" name="group[13285][128]" id="mce-group[13285]-13285-8")
+ label(for="mce-group[13285]-13285-8") everything
+ //- visible: language
+ .column.mc-field-group.input-group
+ span !{site.data.defaults.conference.newsletter_lang_challenge}
+ ul
+ li
+ input(type="checkbox" value="1" name="group[7981][1]" id="mce-group[7981]-7981-0")
+ label(for="mce-group[7981]-7981-0") !{site.data.defaults.conference.newsletter_lang_label}
+ //- hidden: email format
+ .mc-field-group.input-group.is-hidden
+ strong Email Format
+ ul
+ li
+ input(type="radio" value="html" name="EMAILTYPE" id="mce-EMAILTYPE-0" checked)
+ label(for="mce-EMAILTYPE-0") html
+ li
+ input(type="radio" value="text" name="EMAILTYPE" id="mce-EMAILTYPE-1")
+ label(for="mce-EMAILTYPE-1") text
+ //- hidden: GDPR and permissions -- configura in site.defaults
+ div(id="mergeRow-gdpr").mergeRow.gdpr-mergeRow.content__gdprBlock.mc-field-group.is-hidden
+ .content__gdpr
+ label I give you these marketing permissions
+ p We will use the information you provide on this form to be in touch with you and to provide updates and marketing. Please let us know all the ways you would like to hear from us - SELECT AT LEAST ONE!
+ fieldset(id="interestgroup_field").mc_fieldset.gdprRequired.mc-field-group
+ label(for="gdpr_1").checkbox.subfield Email (updates about the conferences)
+ input(type="checkbox" id="gdpr_1" name="gdpr[1]" value="Y").av-checkbox
+ label(for="gdpr_5").checkbox.subfield Direct Mail (like discount codes, commercials info from us and/or from our sponsors)
+ input(type="checkbox" id="gdpr_5" name="gdpr[5]" value="Y").av-checkbox
+ label(for="gdpr_9").checkbox.subfield Customized online advertising (that means you could see other online ads that may likely interest you)
+ input(type="checkbox" id="gdpr_9" name="gdpr[9]" value="Y").av-checkbox
+ .content__gdprLegal
+ p !{site.data.defaults.conference.newsletter_disclaimer}
+ a(href=site.data.defaults.conference.newsletter_legal_url target="_blank" rel="external noopener noreferrer") !{site.data.defaults.conference.newsletter_legal_label}
+ div(id="mce-responses").clear
+ div(id="mce-error-response" style="display:none").response
+ div(id="mce-success-response" style="display:none").response
+ //- hidden: mailchimp key
+ div(style="position: absolute; left: -5000px;" aria-hidden="true")
+ input(type="text" name="b_29d918424cd5375f4c0c54c00_204120a4eb" tabindex="-1" value="")
+ //- visible: submit!
+ div.clear
+ input(type="submit" value=site.data.defaults.conference.newsletter_subscribe_label name="subscribe" id="mc-embedded-subscribe").button.is-medium.is-rounded.is-primary
diff --git a/themes/grusp_conf/layout/components/newsletter/newsletter.pug b/themes/grusp_conf/layout/components/newsletter/newsletter.pug
new file mode 100644
index 0000000..ade4c22
--- /dev/null
+++ b/themes/grusp_conf/layout/components/newsletter/newsletter.pug
@@ -0,0 +1,17 @@
+section(id="newsletter").section_nopadding
+ if(site.data.defaults.conference.workshop_visible)
+ .newsletter__container
+ .inner
+ h2(role="heading" aria-level="2").title-is-2 !{site.data.defaults.conference.newsletter_title}
+ p
+ strong !{site.data.defaults.conference.newsletter_subtitle}
+ .mailchimp-container
+ include _mailchimp.pug
+ else
+ .newsletter__container.negative
+ .inner
+ h2(role="heading" aria-level="2").title-is-2 !{site.data.defaults.conference.newsletter_title}
+ p
+ strong !{site.data.defaults.conference.newsletter_subtitle}
+ .mailchimp-container
+ include _mailchimp.pug
diff --git a/themes/grusp_conf/layout/components/newsletter/newsletter.sass b/themes/grusp_conf/layout/components/newsletter/newsletter.sass
new file mode 100644
index 0000000..cf02a61
--- /dev/null
+++ b/themes/grusp_conf/layout/components/newsletter/newsletter.sass
@@ -0,0 +1,114 @@
+//- Mailchimp form
+.mailchimp-container
+ a
+ color: $main-text-color_inverted
+ .mc-field-group
+ position: relative
+ text-align: left
+ margin: 0 1em
+ &.inset-label
+ label
+ position: absolute
+ top: 18px
+ left: 18px
+ color: $main-text-color_hue-medium
+ input:focus ~ label
+ top: -10px
+ color: $main-text-color_inverted
+ font-size: .8em
+ input[type='text'], input[type='email']
+ padding: .5em
+ font-size: 1em
+ min-width: 100%
+ input[type='checkbox']
+ margin: 0 1em
+ width: 20px
+ height: 20px
+ vertical-align: text-bottom
+ ul
+ display: inline-block
+ li
+ margin: 0 1em
+ .checkbox-container
+ display: block
+ position: relative
+ padding-left: 35px
+ margin-bottom: 12px
+ cursor: pointer
+ font-size: 1em
+ -webkit-user-select: none
+ -moz-user-select: none
+ -ms-user-select: none
+ user-select: none
+ input
+ position: absolute
+ opacity: 0
+ cursor: pointer
+ height: 0
+ width: 0
+ .checkmark
+ position: absolute
+ top: 0
+ left: 0
+ height: 25px
+ width: 25px
+ background-color: $main-text-color_inverted
+ &::after
+ content: ""
+ position: absolute
+ display: none
+ left: 10px
+ top: 4px
+ width: 5px
+ height: 16px
+ -webkit-transform: rotate(45deg)
+ -ms-transform: rotate(45deg)
+ transform: rotate(45deg)
+ &:hover input ~ .checkmark, &:active input ~ .checkmark, &:focus input ~ .checkmark
+ opacity: .8
+ input:checked ~ .checkmark
+ opacity: 1
+ background-color: $main-text-color_inverted
+ input:checked ~ .checkmark:after
+ display: block
+ background-color: $main-color
+ &:after
+
+.newsletter__container
+ background-color: $main-color
+ color: $main-text-color_inverted
+ padding: 4em 0
+ p, strong
+ color: $main-text-color_inverted
+ .inner
+ margin: 0 auto
+ align-items: center
+ text-align: center
+ padding: 1em 0
+ h2
+ font-style: normal
+ .button.is-primary
+ background-color: $main-text-color_inverted !important
+ border-color: $main-text-color_inverted
+ color: $main-color
+ &:hover, &:active, &:focus
+ background-color: $main-text-color !important
+ color: $main-text-color_inverted !important
+ &.negative
+ background-color: $main-text-color_inverted
+ color: $main-text-color
+ p, strong
+ color: $main-color
+ .button.is-primary
+ background-color: $main-color !important
+ border-color: $main-text-color
+ color: $main-text-color_inverted
+ &:hover, &:active, &:focus
+ background-color: $main-text-color_inverted !important
+ border-color: $main-text-color !important
+ color: $main-text-color !important
+ .mailchimp-container
+ a
+ color: $main-text-color
+
+
diff --git a/themes/grusp_conf/layout/components/speakers/speakers.pug b/themes/grusp_conf/layout/components/speakers/speakers.pug
new file mode 100644
index 0000000..391872d
--- /dev/null
+++ b/themes/grusp_conf/layout/components/speakers/speakers.pug
@@ -0,0 +1,63 @@
+section(id="hero__speakers").section_nopadding
+ .speakers__container
+ - no_of_speakers = 0
+ - no_of_mcs = 0
+ - suffix = ""
+ - const var_speakers = []
+ each speaker in site.data.talks_speakers.speakers
+ if(speaker.speaker_in_speaker_lists === true)
+ - var_speakers.push(speaker)
+ each speaker in var_speakers
+ if speaker.is_mc === true
+ - no_of_mcs++
+ else
+ - no_of_speakers++
+ if no_of_speakers > 1 && config.language === 'en'
+ - suffix = "s"
+ if no_of_mcs > 1 && config.language === 'en'
+ - mcs_suffix = "s"
+ .columns
+ .column.inner
+ h2(role="heading" aria-level="2").title.is-2
+ if site.data.defaults.conference.speaker_count_text
+ | !{site.data.defaults.conference.speaker_count_text}
+ else
+ | !{no_of_speakers} !{site.data.defaults.conference.speakers_title}!{suffix}
+ if no_of_mcs > 0
+ = " + "
+ | !{no_of_mcs} !{site.data.defaults.conference.mcs_title}!{mcs_suffix}
+ .inner_holder
+ //- removed sort
+ //-- const filtered_speaker_names = var_speakers.map(speaker => speaker.speaker_name).filter((value, index, self) => self.indexOf(value) === index).sort((a, b) => (a.speaker_name > b.speaker_name) ? 1 : -1)
+ - const filtered_speaker_names = var_speakers.map(speaker => speaker.speaker_name).filter((value, index, self) => self.indexOf(value) === index)
+ - const map = new Map()
+ - const filtered = []
+ each item in var_speakers
+ if(!map.has(item.speaker_name))
+ - map.set(item.speaker_name, true)
+ - filtered.push({speaker_name: item.speaker_name, speaker_slug: slugify(item.speaker_name), speaker_pic_filename: item.speaker_pic_filename, speaker_role: item.speaker_role, is_mc: item.is_mc})
+ each speaker in filtered
+ - filename = `/img/speakers/${speaker.speaker_pic_filename}`
+ - target_href = `/talks_speakers#${speaker.speaker_slug}`
+ .card.speaker-card(class=speaker.is_mc ? 'speaker-card--mc' : '')
+ a(href=target_href role="button" aria-label=speaker.speaker_name)
+ .card-image
+ img(src=filename role="figure" aria-label=speaker.speaker_name)
+ .card-content
+ p.title !{speaker.speaker_name}
+ p
+ em !{speaker.speaker_role}
+ //- schema.org microdata for speaker
+ - same_as = []
+ if(speaker.speaker_github_url)
+ - same_as.push(speaker.speaker_github_url)
+ if(speaker.speaker_twitter_url)
+ - same_as.push(speaker.speaker_twitter_url)
+ //- TODO add same_as as array
+ script(type="application/ld+json").
+ {
+ "@type": "Person",
+ "name": "#{speaker.speaker_name}",
+ "disambiguatingDescription": "#{speaker.speaker_role}",
+ "performerIn": { "@id": "#{full_url_for(site.url)}" }
+ }
\ No newline at end of file
diff --git a/themes/grusp_conf/layout/components/speakers/speakers.sass b/themes/grusp_conf/layout/components/speakers/speakers.sass
new file mode 100644
index 0000000..dc0cbad
--- /dev/null
+++ b/themes/grusp_conf/layout/components/speakers/speakers.sass
@@ -0,0 +1,53 @@
+.speakers__container
+ padding: 3em 0
+ margin: 0
+ background-color: $main-text-color_hue-lighter
+ .columns
+ margin: 0
+ .inner
+ margin: 0 auto
+ max-width: 1200px
+ h2
+ text-align: center
+ font-style: normal
+ color: $main-color
+ a:hover, a:active, a:focus
+ text-decoration: none
+ a p.subtitle, a p em
+ color: $main-text-color
+ p:hover, a p:active, a p:focus
+ color: $main-color_hue-medium
+ a p em:hover, a p em:active, a p em:focus
+ color: $main-color_hue-medium
+ a .card-image
+ max-height: 200px
+ overflow: hidden
+ img
+ transition: transform .5s
+ &:hover, &:active, &:focus
+ transform: scale(1.1)
+ .inner_holder
+ display: flex
+ justify-content: center
+ flex-wrap: wrap
+ .speaker-card
+ max-width: 200px
+ padding: 20px
+ text-align: center
+ font-weight: 300
+ &.speaker-card--mc
+ background-color: $main-color
+ .card-content
+ .subtitle, p, .title, em
+ color: $main-text-color_inverted
+ .card-content
+ display: flex
+ flex-direction: column
+ font-weight: initial
+ .subtitle, p
+ font-size: .9em
+ margin: .5em 0 0
+ .title
+ font-size: 1em
+ font-weight: 600
+ color: $main-color
diff --git a/themes/grusp_conf/layout/components/sponsors/sponsors.pug b/themes/grusp_conf/layout/components/sponsors/sponsors.pug
new file mode 100644
index 0000000..b1e87c7
--- /dev/null
+++ b/themes/grusp_conf/layout/components/sponsors/sponsors.pug
@@ -0,0 +1,148 @@
+section(id="partners").section_nopadding
+ .partners__container
+ .inner
+ if(is_home())
+ h2(role="heading" aria-level="2").title.is-2 !{site.data.defaults.conference.sponsor_title_home}
+ else
+ h2(role="heading" aria-level="2").title.is-2 !{site.data.sponsors.sponsors_block_title}
+ if site.data.sponsors.main
+ .row__underlined
+ h3(role="heading" aria-level="3").title.is-3 Main
+ .columns
+ each sponsor in site.data.sponsors.main
+ .column.column__main
+ - filename = `/img/logos/${sponsor.logo_filename}`
+ a(href=sponsor.site_url target="_blank" rel="noopener noreferrer external" role="button" aria-label=sponsor.name)
+ img(src=filename alt=sponsor.name)
+ if site.data.sponsors.diamond
+ .row__underlined
+ h3(role="heading" aria-level="3").title.is-3 Diamond
+ .columns
+ each sponsor in site.data.sponsors.diamond
+ .column.column__diamond
+ - filename = `/img/logos/${sponsor.logo_filename}`
+ a(href=sponsor.site_url target="_blank" rel="noopener noreferrer external" role="button" aria-label=sponsor.name)
+ img(src=filename alt=sponsor.name)
+ if site.data.sponsors.platinum
+ .row__underlined
+ h3(role="heading" aria-level="3").title.is-3 Platinum
+ .columns
+ each sponsor in site.data.sponsors.platinum
+ .column.column__platinum
+ - filename = `/img/logos/${sponsor.logo_filename}`
+ a(href=sponsor.site_url target="_blank" rel="noopener noreferrer external" role="button" aria-label=sponsor.name)
+ img(src=filename alt=sponsor.name)
+ if site.data.sponsors.gold
+ .row__underlined
+ h3(role="heading" aria-level="3").title.is-3 Gold
+ .columns
+ each sponsor in site.data.sponsors.gold
+ .column.column__gold
+ - filename = `/img/logos/${sponsor.logo_filename}`
+ a(href=sponsor.site_url target="_blank" rel="noopener noreferrer external" role="button" aria-label=sponsor.name)
+ img(src=filename alt=sponsor.name)
+ if site.data.sponsors.silver
+ .row__underlined
+ h3(role="heading" aria-level="3").title.is-3 Silver
+ .columns
+ each sponsor in site.data.sponsors.silver
+ .column.column__silver
+ - filename = `/img/logos/${sponsor.logo_filename}`
+ a(href=sponsor.site_url target="_blank" rel="noopener noreferrer external" role="button" aria-label=sponsor.name)
+ img(src=filename alt=sponsor.name)
+ if site.data.sponsors.bronze
+ .row__underlined
+ h3(role="heading" aria-level="3").title.is-3 Bronze
+ .columns
+ each sponsor in site.data.sponsors.bronze
+ .column.column__bronze
+ - filename = `/img/logos/${sponsor.logo_filename}`
+ a(href=sponsor.site_url target="_blank" rel="noopener noreferrer external" role="button" aria-label=sponsor.name)
+ img(src=filename alt=sponsor.name)
+ if site.data.sponsors.diversity
+ .row__underlined
+ h3(role="heading" aria-level="3").title.is-3 Diversity
+ .columns
+ each sponsor in site.data.sponsors.diversity
+ .column.column__diversity
+ - filename = `/img/logos/${sponsor.logo_filename}`
+ a(href=sponsor.site_url target="_blank" rel="noopener noreferrer external" role="button" aria-label=sponsor.name)
+ img(src=filename alt=sponsor.name)
+ .row__underlined
+ h3(role="heading" aria-level="3").title.is-3 Event production
+ .columns
+ .column.column__production
+ a(href="https://apropos.srl/" target="_blank" rel="noopener noreferrer external" role="button" aria-label="Apropos Srl")
+ img(src="/img/logos/apropos.svg" alt="Apropos Srl")
+
+ .row__underlined
+ h3(role="heading" aria-level="3").title.is-3 Media partner
+ .columns.grusp_media_partners(data-name=config.slug data-tags=site.data.sponsors.partner_tags.join(' '))
+
+ //- schema.org microdata
+ if site.data.sponsors.main
+ each sponsor in site.data.sponsors.main
+ script(type="application/ld+json").
+ {
+ "sponsor":
+ {
+ "type": "Organization",
+ "name": "#{sponsor.name}",
+ "url": "#{sponsor.site_url}"
+ }
+ }
+ if site.data.sponsors.diamond
+ each sponsor in site.data.sponsors.diamond
+ script(type="application/ld+json").
+ {
+ "sponsor":
+ {
+ "type": "Organization",
+ "name": "#{sponsor.name}",
+ "url": "#{sponsor.site_url}"
+ }
+ }
+ if site.data.sponsors.platinum
+ each sponsor in site.data.sponsors.platinum
+ script(type="application/ld+json").
+ {
+ "sponsor":
+ {
+ "type": "Organization",
+ "name": "#{sponsor.name}",
+ "url": "#{sponsor.site_url}"
+ }
+ }
+ if site.data.sponsors.gold
+ each sponsor in site.data.sponsors.gold
+ script(type="application/ld+json").
+ {
+ "sponsor":
+ {
+ "type": "Organization",
+ "name": "#{sponsor.name}",
+ "url": "#{sponsor.site_url}"
+ }
+ }
+ if site.data.sponsors.silver
+ each sponsor in site.data.sponsors.silver
+ script(type="application/ld+json").
+ {
+ "sponsor":
+ {
+ "type": "Organization",
+ "name": "#{sponsor.name}",
+ "url": "#{sponsor.site_url}"
+ }
+ }
+ if site.data.sponsors.bronze
+ each sponsor in site.data.sponsors.bronze
+ script(type="application/ld+json").
+ {
+ "sponsor":
+ {
+ "type": "Organization",
+ "name": "#{sponsor.name}",
+ "url": "#{sponsor.site_url}"
+ }
+ }
diff --git a/themes/grusp_conf/layout/components/sponsors/sponsors.sass b/themes/grusp_conf/layout/components/sponsors/sponsors.sass
new file mode 100644
index 0000000..aae8a05
--- /dev/null
+++ b/themes/grusp_conf/layout/components/sponsors/sponsors.sass
@@ -0,0 +1,50 @@
+.partners__container
+ background-color: $main-text-color_inverted
+ color: $main-color
+ h2
+ font-style: normal
+
+.partners__container .inner
+ margin: 0 auto
+ align-items: center
+ text-align: center
+ padding: 1em 0
+ .row__underlined
+ width: 100%
+ border-bottom: 1px solid $main-text-color_hue-light
+ text-align: left
+ h3
+ font-size: 1em
+ .columns
+ padding: 2em 0
+ justify-content: center
+ flex-flow: wrap
+ .column
+ margin: 0 1em
+ .column__main, .column__main img
+ min-width: 320px
+ max-width: 320px
+ .column__diamond, .column__diamond img
+ min-width: 280px
+ max-width: 280px
+ .column__platinum, .column__platinum img
+ min-width: 240px
+ max-width: 240px
+ .column__gold, .column__gold img
+ min-width: 200px
+ max-width: 200px
+ .column__silver, .column__silver img
+ min-width: 160px
+ max-width: 160px
+ .column__bronze, .column__bronze img
+ min-width: 120px
+ max-width: 120px
+ .column__diversity, .column__diversity img
+ min-width: 120px
+ max-width: 120px
+ .column__media, .column__media img
+ min-width: 100px
+ max-width: 100px
+ .column__production, .column__production img
+ min-width: 200px
+ max-width: 200px
diff --git a/themes/grusp_conf/layout/components/topics/topics.pug b/themes/grusp_conf/layout/components/topics/topics.pug
new file mode 100644
index 0000000..76c8dfb
--- /dev/null
+++ b/themes/grusp_conf/layout/components/topics/topics.pug
@@ -0,0 +1,10 @@
+section(id="topics").section_nopadding
+ .topics_container
+ .inner
+ h2(role="heading" aria-level="2").is-title.is-2 !{site.data.defaults.conference.topics_title}
+ p !{site.data.defaults.conference.topics_description}
+ .topics
+ each topic in site.data.defaults.conference.topics
+ .topic !{topic}
+ p
+ em !{site.data.defaults.conference.topics_payoff}
\ No newline at end of file
diff --git a/themes/grusp_conf/layout/components/topics/topics.sass b/themes/grusp_conf/layout/components/topics/topics.sass
new file mode 100644
index 0000000..3ef357f
--- /dev/null
+++ b/themes/grusp_conf/layout/components/topics/topics.sass
@@ -0,0 +1,21 @@
+.topics_container
+ background-color: $main-color
+ color: $main-text-color_inverted
+ text-align: center
+ .inner
+ margin: 0 auto
+ padding: 2em 0
+ .topics
+ display: flex
+ flex: 1
+ flex-wrap: wrap
+ justify-content: center
+ align-content: center
+ align-items: center
+ justify-items: center
+ .topic
+ background-color: $main-text-color_inverted
+ color: $main-text-color
+ font-weight: 600
+ padding: 1em
+ margin: 1em
diff --git a/themes/grusp_conf/layout/components/update/update.pug b/themes/grusp_conf/layout/components/update/update.pug
new file mode 100644
index 0000000..b1dd95c
--- /dev/null
+++ b/themes/grusp_conf/layout/components/update/update.pug
@@ -0,0 +1,9 @@
+section(id="updates").section_nopadding
+ .update__container
+ .inner
+ if(site.data.defaults.conference.update_is_warning)
+ include ../../../source/assets/ico/ico-warning.svg
+ h2(role="heading" aria-level="2").is-title.is-2 !{site.data.defaults.conference.update_title}
+ p !{site.data.defaults.conference.update_description}
+ p
+ a(role="button" href=site.data.defaults.conference.update_link_url aria-label=site.data.defaults.conference.update_link_label target="_blank" rel="external noopener noreferrer").button.is-medium.is-rounded.is-primary !{site.data.defaults.conference.update_link_label}
\ No newline at end of file
diff --git a/themes/grusp_conf/layout/components/update/update.sass b/themes/grusp_conf/layout/components/update/update.sass
new file mode 100644
index 0000000..59fa5f1
--- /dev/null
+++ b/themes/grusp_conf/layout/components/update/update.sass
@@ -0,0 +1,16 @@
+.update__container
+ background-color: $main-text-color
+ .inner
+ margin: 0 auto
+ padding: 2em 0
+ text-align: center
+ h2, p
+ color: $main-text-color_inverted
+ a
+ max-width: 100%
+ font-size: .9em
+ +tablet
+ font-size: 1em
+ svg
+ path
+ fill: $main-text-color_inverted
\ No newline at end of file
diff --git a/themes/grusp_conf/layout/components/workshop/workshop.pug b/themes/grusp_conf/layout/components/workshop/workshop.pug
new file mode 100644
index 0000000..f1c4cf6
--- /dev/null
+++ b/themes/grusp_conf/layout/components/workshop/workshop.pug
@@ -0,0 +1,114 @@
+section(id="workshop").section_nopadding
+ - no_of_workshops = 0
+ - suffix = ""
+ each workshop in site.data.workshop.workshops
+ - no_of_workshops++
+ if no_of_workshops > 1 && config.language === 'en'
+ - suffix = "s"
+
+ .container
+ .inner
+ if(page.layout != "page_workshops")
+ h2(role="heading" aria-level="2").title.is-2 !{no_of_workshops} !{site.data.defaults.conference.workshops_title}!{suffix}
+ else
+ h1(role="heading" aria-level="1").title.is-1 !{no_of_workshops} !{site.data.defaults.conference.workshops_title}!{suffix}
+
+ each workshop in site.data.workshop.workshops
+ .workshop__container
+ .columns.inner
+ .column.workshop__info
+ - read_more_url = workshop.page_uri
+ - aria_label = site.data.workshop.read_more_label
+ .row-info
+ .info-icon
+
+ if(workshop.online_location)
+ include ../../../source/assets/ico/ico-online-conference.svg
+ else
+ include ../../../source/assets/ico/ico-where.svg
+
+ if(workshop.online_location)
+ .info__location !{workshop.online_location}
+ else
+ .info__location !{workshop.location}
+
+ | |
+
+ .info-icon.padded
+ include ../../../source/assets/ico/ico-calendar.svg
+ .info__date
+
+ - var start_date = ""
+ if(workshop.date_text)
+ - start_date = workshop.date_text
+ else if(site.data.defaults.conference.is_online_only === true)
+ - start_date = date(workshop.date, config.date_format_hero_online)
+ else
+ - start_date = date(workshop.date, config.date_format_hero)
+
+ time(datetime=workshop.date) !{start_date}
+ a(href=url_for(read_more_url) role="button" aria-label=aria_label)
+ h5(role="heading" aria-level="5") !{workshop.workshop_title}
+ p !{workshop.description}
+ p
+ each teacher in workshop.teachers
+ strong !{teacher.teacher_name}
+ |
+ span !{teacher.teacher_role}
+ | @
+ span !{teacher.teacher_org}
+ br
+ .column.workshop-buttons
+ .workshop-buttons__button-container
+ a(href=url_for(read_more_url) role="button" aria-label=aria_label)
+ .workshop-buttons__button
+ include ../../../source/assets/ico/ico-readmore.svg
+ a(href=url_for(read_more_url) role="button" aria-label=aria_label) !{aria_label}
+ .workshop-buttons__button-container
+ if (!workshop.is_external)
+ a(href=workshop.ticket_url role="button" target="_blank" rel="noopener noreferrer external")
+ .workshop-buttons__button
+ include ../../../source/assets/ico/ico-ticket.svg
+ a(href=workshop.ticket_url role="button" aria-label=site.data.defaults.conference.workshops_tickets_label target="_blank" rel="noopener noreferrer external") !{site.data.defaults.conference.workshops_tickets_label}
+ else
+ a(href="#" role="button" target="_blank" rel="noopener noreferrer external")
+ .workshop-buttons__button
+ include ../../../source/assets/ico/ico-pencil.svg
+ a(href="#" role="button" aria-label=site.data.defaults.conference.workshops_register_label target="_blank" rel="noopener noreferrer external") !{site.data.defaults.conference.workshops_register_label}
+ //- (sub)event microdata
+ script(type="application/ld+json").
+ {
+ "@context": "https://schema.org",
+ "@type": "Event",
+ "@id": "#{read_more_url}",
+ "superEvent":
+ {
+ "@type": "Event",
+ "@id": "#{full_url_for(site.root)}"
+ },
+ "location":
+ {
+ "@type": "Place",
+ "address":
+ {
+ "@type": "PostalAddress",
+ "addressLocality": "#{workshop.location}",
+ "streetAddress": "#{workshop.location_address}"
+ },
+ "name": "#{workshop.location_name}"
+ },
+ "name": "#{workshop.workshop_title}",
+ "startDate": "#{workshop.date}",
+ "endDate": "#{workshop.end_date}",
+ "description": "#{workshop.description}"
+ }
+ //- schema.org microdata for speaker
+ each teacher in workshop.teachers
+ - desc = teacher.teacher_role + " at " + teacher.teacher_org
+ script(type="application/ld+json").
+ {
+ "@type": "Person",
+ "name": "#{teacher.teacher_name}",
+ "disambiguatingDescription": "#{desc}",
+ "performerIn": { "@id": "#{full_url_for(workshop.page_uri)}" }
+ }
\ No newline at end of file
diff --git a/themes/grusp_conf/layout/components/workshop/workshop.sass b/themes/grusp_conf/layout/components/workshop/workshop.sass
new file mode 100644
index 0000000..97a84f2
--- /dev/null
+++ b/themes/grusp_conf/layout/components/workshop/workshop.sass
@@ -0,0 +1,117 @@
+#workshop
+ h2
+ text-align: center
+ font-style: normal
+ color: $main-color !important
+
+.workshop__container
+ padding: 1em 0 2em
+ margin: 0
+ .inner
+ margin: 0 auto
+ max-width: 1200px
+ border-bottom: 1px solid $main-text-color_hue-medium
+ .workshop__info
+ text-align: left
+ strong
+ color: $main-color
+ &:last-of-type .inner
+ border-bottom: none
+ h5
+ text-transform: none
+ font-weight: 600
+ color: $main-color !important
+ p
+ color: $main-text-color
+ .columns
+ margin-top: 1em
+ margin-bottom: 0
+ flex-wrap: wrap
+ &.no-margin-top
+ margin-top: 0
+ &.workshop__info
+ display: flex
+ flex-direction: column
+ align-content: space-between
+ min-width: 240px
+ .workshop__info
+ max-width: 80%
+ margin: 0 auto
+ +tablet
+ min-width: 600px
+ .workshop-buttons
+ display: flex
+ flex-wrap: wrap
+ justify-content: center
+ align-content: center
+ max-width: 80%
+ margin: 0 auto
+ +tablet
+ min-width: 450px
+ .workshop-buttons__button-container
+ min-width: 190px
+ height: 190px
+ margin: 10px
+ display: flex
+ flex-direction: column
+ align-items: center
+ align-content: center
+ justify-content: center
+ text-align: center
+ background-color: $main-color !important
+ border: 1px solid $main-color !important
+ &:hover, &:focus, &:active
+ background-color: $main-text-color_inverted !important
+ svg path, svg polygon
+ fill: $main-color !important
+ a
+ color: $main-text-color_inverted
+ text-transform: uppercase
+ font-size: .8em
+ font-weight: 600
+ &:hover > a, &:focus > a, &:active > a
+ color: $main-color !important
+ text-decoration: none
+ .workshop-buttons__button
+ width: 120px
+ height: 120px
+ svg path, svg polygon
+ fill: $main-text-color_inverted
+
+ .row-info
+ color: $main-text-color
+ display: flex
+ flex-direction: row
+ align-items: center
+ text-transform: uppercase
+ font-size: .7em
+ +tablet
+ font-size: .9em
+ .info__date
+ padding: 0 10px 0 10px
+ .info-icon
+ margin-top: 6px
+ .info-icon.padded
+ padding: 0 0 0 10px
+ +tablet
+ padding: 0 0 0 10px
+ svg
+ height: 30px
+ width: auto
+ .row__more
+ padding-top: 2em
+ flex-wrap: wrap
+ .button.is-primary
+ background-color: $main-color
+ font-weight: 700
+ padding-left: 1em
+ padding-right: 1em
+ margin: 10px auto
+ +tablet
+ padding-left: 2em
+ padding-right: 2em
+ margin-right: 1em
+ &:hover, &:active, &:focus
+ color: $main-color
+ border-color: $main-color
+ background-color: $main-text-color_inverted
\ No newline at end of file
diff --git a/themes/grusp_conf/layout/includes/_breadcrumbs.pug b/themes/grusp_conf/layout/includes/_breadcrumbs.pug
new file mode 100644
index 0000000..0670861
--- /dev/null
+++ b/themes/grusp_conf/layout/includes/_breadcrumbs.pug
@@ -0,0 +1,14 @@
+block content
+ .container_breadcrumbs
+ .inner
+ nav(role="navigation" itemscope="itemscope" itemtype="https://schema.org/SiteNavigationElement" aria-label="breadcrumbs menu").breadcrumb.has-arrow-separator
+ ul
+ li
+ a(href=url_for(site.url) role="button" aria-label="home page") home
+ if(page.parent)
+ - intermediate_url = `${url_for(site.url)}${page.parent}`
+ li
+ a(href=url_for(intermediate_url)) !{page.parent}
+ li.is-active
+ a(role="button" aria-label=page.title) !{page.title}
+
diff --git a/themes/grusp_conf/layout/includes/_social.pug b/themes/grusp_conf/layout/includes/_social.pug
new file mode 100644
index 0000000..afe4694
--- /dev/null
+++ b/themes/grusp_conf/layout/includes/_social.pug
@@ -0,0 +1,23 @@
+.row__social
+ p !{site.data.defaults.conference.social_follow}
+ a(href=site.data.defaults.conference.social_fb_url target="_blank" role="button" rel="noopener noreferrer external" aria-label="facebook")
+ .social-icon
+ include ../../source/assets/ico/ico-social-facebook.svg
+ a(href=site.data.defaults.conference.social_twitter_url target="_blank" role="button" rel="noopener noreferrer external" aria-label="twitter")
+ .social-icon
+ include ../../source/assets/ico/ico-social-twitter.svg
+ a(href=site.data.defaults.conference.social_vimeo_url target="_blank" role="button" rel="noopener noreferrer external" aria-label="vimeo")
+ .social-icon
+ include ../../source/assets/ico/ico-social-vimeo.svg
+ a(href=site.data.defaults.conference.social_youtube_url target="_blank" role="button" rel="noopener noreferrer external" aria-label="youtube")
+ .social-icon
+ include ../../source/assets/ico/ico-social-youtube.svg
+ a(href=site.data.defaults.conference.social_linkedin_url target="_blank" role="button" rel="noopener noreferrer external" aria-label="linkedin")
+ .social-icon
+ include ../../source/assets/ico/ico-social-linkedin.svg
+ a(href=site.data.defaults.conference.social_instagram_url target="_blank" role="button" rel="noopener noreferrer external" aria-label="instagram")
+ .social-icon
+ include ../../source/assets/ico/ico-social-instagram.svg
+ a(href=site.data.defaults.conference.social_mastodon_url target="_blank" role="button" rel="noopener noreferrer external" aria-label="instagram")
+ .social-icon
+ include ../../source/assets/ico/ico-social-mastodon.svg
diff --git a/themes/grusp_conf/layout/includes/footer.pug b/themes/grusp_conf/layout/includes/footer.pug
new file mode 100644
index 0000000..92ceb63
--- /dev/null
+++ b/themes/grusp_conf/layout/includes/footer.pug
@@ -0,0 +1,63 @@
+footer
+ - contact_url = "mailto:" + site.data.defaults.conference.contact_email
+ .columns.inner
+ .column.first.is-one-third
+
+ - var start_date = ""
+ - var where = ""
+ if(site.data.defaults.conference.is_online_only === true)
+ - start_date = date(site.data.defaults.conference.date, config.date_format_hero_online)
+ - where = site.data.defaults.conference.online_location
+ else
+ - start_date = date(site.data.defaults.conference.date, config.date_format_hero)
+ - where = site.data.defaults.conference.city
+
+ p.footer__p_padded
+ strong !{where}
+ | ,
+ time(datetime=site.data.defaults.conference.date) !{start_date}
+
+ if(site.data.defaults.conference.past_editions)
+ p !{site.data.defaults.conference.past_editions_pre}
+ p
+ each item in site.data.defaults.conference.past_editions
+ - url = "https://" + item + "." + site.data.defaults.conference.base_url
+ a(href=url target="_blank" rel="noopener noreferrer").past-edition !{item}
+ p !{site.data.defaults.conference.past_editions_videos_pre}
+ a(href=site.data.defaults.conference.social_vimeo_url) !{site.data.defaults.conference.past_editions_videos_vimeo_label}
+ | !{site.data.defaults.conference.past_editions_videos_mid}
+ a(href=site.data.defaults.conference.social_youtube_url) !{site.data.defaults.conference.past_editions_videos_youtube_label}
+ | !{site.data.defaults.conference.past_editions_videos_post}
+
+ include _social.pug
+ .column.is-one-third
+ nav(role="navigation" itemscope="itemscope" itemtype="https://schema.org/SiteNavigationElement" aria-label="Footer menu")
+ ul
+ each page_label, page_key in theme.menu
+ li
+ a(href=url_for(page_key) role="button" aria-label=page_label) !{page_label}
+ if (site.data.defaults.conference.ticket_button_visible)
+ li
+ a(href=url_for("tickets") role="button" aria-label=site.data.defaults.conference.buy_tickets_label) !{site.data.defaults.conference.menu_buy_tickets_label}
+ .column.is-one-third
+ .footer__logo
+ include ../../../../source/img/grusp-logo-full.svg
+ .columns.inner.is-centered
+ .column
+ p !{site.data.defaults.conference.title} !{site.data.defaults.conference.footer_copy_text}
+ p !{site.data.defaults.conference.footer_contact_text}
+ a(href=contact_url role="button" rel="external") !{site.data.defaults.conference.contact_email}
+
+ p !{site.data.defaults.conference.footer_links_pre}
+ - privacy_policy_url = site.data.defaults.conference.privacy_policy_url_common + site.data.defaults.conference.iubenda.cookiePolicyId
+ a(href=privacy_policy_url target="_blank" rel="noopener noreferrer") !{site.data.defaults.conference.footer_links_privacy_link_label}
+ | #{site.data.defaults.conference.footer_link_middle}
+ a(href="/welcome/coc.html") !{site.data.defaults.conference.footer_coc_link_label}
+
+a(href="#" role="button" aria-label="back to top")
+ .back-to-top(id="back_to_top").is-hidden
+ .chevron
+script(type="text/javascript" src='/assets/js/back_to_top.js')
+
+// GrUSP Partners
+script(src=`//www.grusp.org/helpers/${config.edition}/partners.js` async)
diff --git a/themes/grusp_conf/layout/includes/header.pug b/themes/grusp_conf/layout/includes/header.pug
new file mode 100644
index 0000000..2e669a5
--- /dev/null
+++ b/themes/grusp_conf/layout/includes/header.pug
@@ -0,0 +1,104 @@
+- classes = ""
+if(is_home())
+ script(type="text/javascript" src='/assets/js/header.js')
+ - classes += "is-transparent"
+
+header(class=classes id="header")
+ .nav-container
+ nav(role="navigation" itemscope="itemscope" itemtype="https://schema.org/SiteNavigationElement" aria-label="Main menu").navbar.dropdown
+ .navbar-brand
+ a(href="/" aria-label="home page").navbar-item
+ .header-logo
+ include ../../source/assets/img/conference-logo.svg
+ a.navbar-burger(role="button" aria-label="menu" aria-expanded="false" data-target="main_menu")
+ span(aria-hidden="true")
+ span(aria-hidden="true")
+ span(aria-hidden="true")
+ .navbar-menu(id="main_menu")
+ .navbar-start
+ .navbar-end
+ each page_label, page_key in theme.menu
+ - aria_label = page_label + " page"
+ if(theme[page_key + '_submenu'])
+ .navbar-item.has-dropdown.is-hoverable
+ a(href=url_for(page_key) aria-label=aria_label).navbar-link !{page_label}
+ .navbar-dropdown
+ each sub_label, sub_key in theme[page_key + '_submenu']
+ - subpage_url = `${url_for(site.url)}${page_key}/${sub_key}.html`
+ - aria_label = sub_label + " page"
+ a(href=url_for(subpage_url) aria-label=aria_label).navbar-item !{sub_label}
+ else
+ a(href=url_for(page_key) aria-label=aria_label).navbar-item !{page_label}
+ if (site.data.defaults.conference.ticket_button_visible)
+ a(href=url_for("tickets") role="button" aria-label=site.data.defaults.conference.buy_tickets_label).button.is-small.is-rounded.is-primary.in-menu !{site.data.defaults.conference.menu_buy_tickets_label}
+
+//- Google Tag Manager
+script(type="text/javascript").
+ (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
+ new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
+ j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
+ 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
+ })(window,document,'script','dataLayer','!{site.data.defaults.conference.google.tag_manager_id}');
+
+
+//- Cookie solution (iubenda)
+script(type="text/javascript").
+ var _iub = _iub || [];
+ _iub.csConfiguration = {
+ "lang": `!{site.data.defaults.conference.iubenda.lang}`,
+ "siteId": !{site.data.defaults.conference.iubenda.siteId},
+ "cookiePolicyId": !{site.data.defaults.conference.iubenda.cookiePolicyId},
+ "localConsentDomain": `!{site.data.defaults.conference.iubenda.localConsentDomain}`,
+ "askConsentAtCookiePolicyUpdate": true,
+ "countryDetection": true,
+ "enableLgpd": true,
+ "enableUspr": true,
+ "floatingPreferencesButtonDisplay": "bottom-left",
+ "invalidateConsentWithoutLog": true,
+ "lgpdAppliesGlobally": false,
+ "perPurposeConsent": true,
+ "whitelabel": false,
+ "banner": {
+ "acceptButtonDisplay": true,
+ "closeButtonDisplay": false,
+ "customizeButtonDisplay": true,
+ "explicitWithdrawal": true,
+ "listPurposes": true,
+ "position": "float-top-center",
+ "rejectButtonDisplay": true
+ },
+ "callback": {
+ onPreferenceExpressedOrNotNeeded: function (preference) {
+ dataLayer.push({
+ iubenda_ccpa_opted_out: _iub.cs.api.isCcpaOptedOut()
+ });
+ if (!preference) {
+ dataLayer.push({
+ event: "iubenda_preference_not_needed"
+ });
+ } else {
+ if (preference.consent === true) {
+ dataLayer.push({
+ event: "iubenda_consent_given"
+ });
+ } else if (preference.consent === false) {
+ dataLayer.push({
+ event: "iubenda_consent_rejected"
+ });
+ } else if (preference.purposes) {
+ for (var purposeId in preference.purposes) {
+ if (preference.purposes[purposeId]) {
+ dataLayer.push({
+ event: "iubenda_consent_given_purpose_" + purposeId
+ });
+ }
+ }
+ }
+ }
+ }
+ }
+ };
+
+//- Cookie solution (iubenda)
+script(type="text/javascript" src="//cdn.iubenda.com/cs/gpp/stub.js" charset="UTF-8").
+script(async type="text/javascript" src="//cdn.iubenda.com/cs/iubenda_cs.js" charset="UTF-8").
diff --git a/themes/grusp_conf/layout/includes/layout.pug b/themes/grusp_conf/layout/includes/layout.pug
new file mode 100644
index 0000000..7bc1614
--- /dev/null
+++ b/themes/grusp_conf/layout/includes/layout.pug
@@ -0,0 +1,115 @@
+
+- var pageTitle = page.title || config.subtitle || ''
+- if (is_home()) pageTitle = 'home'
+- pageTitle += ' | ' + config.title
+
+- var ogDescription = page.description
+- if (is_home()) ogDescription = config.description
+
+doctype html
+html(lang=config.language)
+ head
+ meta(charset='UTF-8')
+ title=pageTitle
+ meta(name='viewport', content='width=device-width, initial-scale=1')
+ link(rel="canonical" href=url.replace('/index.html', '/'))
+
+ meta(property="og:image" content=full_url_for(`/assets/img/social-1200x630.png`))
+ meta(property="og:image:width" content="1200")
+ meta(property="og:image:height" content="630")
+
+ != open_graph({title:pageTitle, description:ogDescription, site_name:config.slug})
+
+ //- Favicons
+ link(rel="apple-touch-icon" sizes="180x180" href=`/assets/favicons/apple-touch-icon.png`)
+ link(rel="icon" type="image/png" sizes="32x32" href=`/assets/favicons/favicon-32x32.png`)
+ link(rel="icon" type="image/png" sizes="16x16" href=`/assets/favicons/favicon-16x16.png`)
+
+ link(rel="manifest" href=`/assets/favicons/site.webmanifest`)
+
+ link(rel="mask-icon" href=`/safari-pinned-tab.svg` color="#5bbad5")
+ meta(name="msapplication-TileColor" content="#da532c")
+ meta(name="theme-color" content="#ffffff")
+
+ if theme.stylesheets !== undefined && theme.stylesheets.length > 0
+ //- stylesheets list from _config.yml
+ each url in theme.stylesheets
+ link(rel='stylesheet', href=url)
+
+ if theme.scripts !== undefined && theme.scripts.length > 0
+ //- scripts list from config.yml
+ each url in theme.scripts
+ script(src=url)
+
+ //- schema.org microdata
+ script(type="application/ld+json").
+ {
+ "@context": "https://schema.org",
+ "@type": "Event",
+ "@id": "#{full_url_for(site.root)}",
+ "location":
+ {
+ "@type": "Place",
+ "address":
+ {
+ "@type": "PostalAddress",
+ "addressLocality": "#{site.data.defaults.conference.md_city}",
+ "addressRegion": "#{site.data.defaults.conference.md_province}",
+ "postalCode": "#{site.data.defaults.conference.md_postal_code}",
+ "streetAddress": "#{site.data.defaults.conference.md_address}"
+ },
+ "name": "#{site.data.defaults.conference.location_name}"
+ },
+ "name": "#{site.data.defaults.conference.title}",
+ "image": "#{config.image}",
+ "startDate": "#{site.data.defaults.conference.date}",
+ "description": "#{config.description}",
+ "offers": [
+ {
+ "@type": "Offer",
+ "description": "Tickets",
+ "availability": "https://schema.org/LimitedAvailability",
+ "url": "#{full_url_for("tickets")}"
+ },
+ {
+ "@type": "Offer",
+ "description": "Scholarships",
+ "availability": "https://schema.org/LimitedAvailability",
+ "url": "#{site.data.page_scholarships.long_version.content_2_link_url}",
+ "priceCurrency": "EUR",
+ "price": "0"
+ }],
+ "organizer":
+ {
+ "@type": "Organization",
+ "name": "#{config.author}",
+ "url": "#{site.data.defaults.conference.organizer_url}",
+ "logo": "#{full_url_for(config.image)}",
+ "contactPoint": [
+ {
+ "@type": "contactPoint",
+ "email": "mailto:#{site.data.defaults.conference.contact_email}"
+ }],
+ "sameAs":
+ [
+ "#{site.data.defaults.conference.social_fb_url}",
+ "#{site.data.defaults.conference.social_twitter_url}",
+ "#{site.data.defaults.conference.social_vimeo_url}",
+ "#{site.data.defaults.conference.social_youtube_url}",
+ "#{site.data.defaults.conference.social_linkedin_url}",
+ "#{site.data.defaults.conference.social_instagram_url}",
+ "#{site.data.defaults.conference.social_mastodon_url}"
+ ]
+ }
+ }
+ script(src='https://js.tito.io/v2' async)
+
+ body
+ #content-outer
+ include header.pug
+ #content-inner(role="main")
+ if body
+ div!= body
+ else
+ block content
+ include footer.pug
diff --git a/themes/grusp_conf/layout/index.pug b/themes/grusp_conf/layout/index.pug
new file mode 100644
index 0000000..8d0d3c4
--- /dev/null
+++ b/themes/grusp_conf/layout/index.pug
@@ -0,0 +1,26 @@
+extends includes/layout.pug
+
+block content
+ include components/hero/hero.pug
+ if(site.data.defaults.conference.update_visible)
+ include components/update/update.pug
+ if(site.data.defaults.conference.cfp_open)
+ include components/cfp/cfp.pug
+ if(site.data.defaults.conference.geninfo_visible)
+ include components/generalinfo/generalinfo.pug
+ if(site.data.defaults.conference.speakers_visible)
+ include components/speakers/speakers.pug
+ if(site.data.defaults.conference.topics_visible)
+ include components/topics/topics.pug
+ if(site.data.defaults.conference.workshop_visible)
+ include components/workshop/workshop.pug
+ //- newsletter form: always visible
+ include components/newsletter/newsletter.pug
+ if(site.data.defaults.conference.media_visible)
+ include components/media/media.pug
+ if(site.data.defaults.conference.location_visible)
+ include components/location/location.pug
+ if(site.data.defaults.conference.sponsors_visible)
+ include components/sponsors/sponsors.pug
+ if site.data.defaults.conference.community_partners
+ include components/community_partners/community_partners.pug
diff --git a/themes/grusp_conf/layout/page_cfp.pug b/themes/grusp_conf/layout/page_cfp.pug
new file mode 100644
index 0000000..e972e74
--- /dev/null
+++ b/themes/grusp_conf/layout/page_cfp.pug
@@ -0,0 +1,48 @@
+extends includes/layout.pug
+
+block content
+ - contact_url = "mailto:" + site.data.defaults.conference.contact_email
+ section(id="cfp")
+ include includes/_breadcrumbs.pug
+
+ .container
+ .inner
+ .title-container
+ include ../source/assets/ico/ico-cfp.svg
+ h1(role="heading" aria-level="1").is-title-is-1 !{site.data.page_cfp.intro.main_title}
+
+ - var cfp_deadline = ""
+ if(site.data.defaults.conference.is_online_only === true)
+ - cfp_deadline = date(site.data.defaults.conference.cfp_deadline, config.date_format_hero_online)
+ else
+ - cfp_deadline = date(site.data.defaults.conference.cfp_deadline, config.date_format_hero)
+
+ p
+ strong !{site.data.page_cfp.intro.date_intro} #{cfp_deadline}
+ p !{site.data.page_cfp.intro.content_1}
+ if(site.data.page_cfp.intro.content_2)
+ p !{site.data.page_cfp.intro.content_2}
+ .container__more
+ .inner
+ h3(role="heading" aria-level="3").is-title.is-3 !{site.data.page_cfp.more_info.title}
+ p !{site.data.page_cfp.more_info.description_1}
+ if(site.data.page_cfp.more_info.description_2)
+ p !{site.data.page_cfp.more_info.description_2}
+ .container.container__contact
+ .inner
+ h3(role="heading" aria-level="3").is-title.is-3 !{site.data.page_cfp.contact.title}
+ p !{site.data.page_cfp.contact.email_intro}
+ a(href=contact_url) !{site.data.defaults.conference.contact_email}
+ if(site.data.page_cfp.contact.help_url)
+ p !{site.data.page_cfp.contact.help_intro}
+ a(href=site.data.page_cfp.contact.help_url) !{href=site.data.page_cfp.contact.help_url}
+ if(site.data.defaults.conference.cfp_open)
+ .is-centered
+ a(href=site.data.page_cfp.cfp_register_url aria-label=site.data.defaults.conference.cfp_register_aria_label).button.is-medium.is-rounded.is-primary !{site.data.defaults.conference.cfp_register_label}
+
+ //- imported components
+ include components/newsletter/newsletter
+ if(site.data.defaults.conference.sponsors_visible)
+ include components/sponsors/sponsors
+ if site.data.defaults.conference.community_partners
+ include components/community_partners/community_partners
diff --git a/themes/grusp_conf/layout/page_workshops.pug b/themes/grusp_conf/layout/page_workshops.pug
new file mode 100644
index 0000000..38047c1
--- /dev/null
+++ b/themes/grusp_conf/layout/page_workshops.pug
@@ -0,0 +1,16 @@
+extends includes/layout.pug
+
+block content
+ - contact_url = "mailto:" + site.data.defaults.conference.contact_email
+
+ //- contenitore di comodo per gestire diverso padding in home e in workshop
+ .workshop-component-holder
+ //- se non esiste `workshop_submenu` nel _config del tema, questa pagina ha il layout del singolo workshop...
+ if(!theme.workshop_submenu)
+ include workshop_single.pug
+ else
+ include includes/_breadcrumbs.pug
+ include components/workshop/workshop
+
+ //- imported components
+ include components/newsletter/newsletter
diff --git a/themes/grusp_conf/layout/safety.pug b/themes/grusp_conf/layout/safety.pug
new file mode 100644
index 0000000..5f04530
--- /dev/null
+++ b/themes/grusp_conf/layout/safety.pug
@@ -0,0 +1,37 @@
+extends includes/layout.pug
+
+block content
+ - contact_url = "mailto:" + site.data.defaults.conference.contact_email
+ section(id="safety")
+ include includes/_breadcrumbs.pug
+
+ .container
+ .inner
+ .title-container
+ include ../source/assets/ico/ico-safety.svg
+ h1(role="heading" aria-level="1").title-is-1 !{site.data.page_safety.main_title}
+ p !{site.data.page_safety.content_1}
+
+ .container.container__short-version
+ .inner
+ if(site.data.page_safety.content_2)
+ p !{site.data.page_safety.content_2}
+ if(site.data.page_safety.content_3)
+ p !{site.data.page_safety.content_3}
+
+ .container.container__long-version
+ .inner
+ if(site.data.page_safety.content_4)
+ p !{site.data.page_safety.content_4}
+ if(site.data.page_safety.content_5)
+ p !{site.data.page_safety.content_5}
+ a(href=contact_url) !{site.data.defaults.conference.contact_email}
+ if(site.data.page_safety.content_6)
+ p !{site.data.page_safety.content_6}
+
+ //- imported components
+ include components/newsletter/newsletter
+ if(site.data.defaults.conference.sponsors_visible)
+ include components/sponsors/sponsors
+ if site.data.defaults.conference.community_partners
+ include components/community_partners/community_partners
\ No newline at end of file
diff --git a/themes/grusp_conf/layout/schedule.pug b/themes/grusp_conf/layout/schedule.pug
new file mode 100644
index 0000000..ea3544e
--- /dev/null
+++ b/themes/grusp_conf/layout/schedule.pug
@@ -0,0 +1,293 @@
+extends includes/layout.pug
+
+
+block content
+ - contact_url = "mailto:" + site.data.defaults.conference.contact_email
+ section(id="schedule")
+
+ //- se in `/source/_data/talks_speakers.yml` il parametro `generate_schedule_page` vale `false`, la pagina viene generata vuota e nel menu non viene inclusa la voce corrispondente
+ if(site.data.talks_speakers.generate_schedule_page === false)
+ .container
+ .inner
+ .title-container.title-container_schedule
+ h1(class=title_classes role="heading" aria-level="1").title-is-1 !{site.data.talks_speakers.schedule_under_construction_title}
+ p !{site.data.talks_speakers.schedule_under_construction_description}
+
+ else
+ include includes/_breadcrumbs.pug
+
+ //- we count the number of tracks in order to know if the table must have more than one column
+ - var no_tracks = Object.keys(site.data.talks_speakers.tracks).length
+
+ .container
+ .inner
+ //- we count the days - useful for the page layout
+ - var no_days = Object.keys(site.data.talks_speakers.days).length
+
+ //- if there is only one day, the title must be aligned to the left
+ - title_classes = ""
+ if(no_days > 1)
+ - title_classes += "is-centered"
+ else
+ - title_classes += "has-text-left"
+
+ .title-container.title-container_schedule
+ h1(class=title_classes role="heading" aria-level="1").title-is-1 !{page.title}
+
+ //- links to every day in page if there is more than 1 day
+ if(no_days > 1)
+ .container.date-menu
+ .inner
+ each day in site.data.talks_speakers.days
+ - anchor = `#${day.title}`
+ a(role="button" href=anchor).button.is-rounded.is-primary.is-medium !{day.title}
+
+ each day in site.data.talks_speakers.days
+ - the_id = day.title
+ .timeline
+ .info-bar
+ .row-info
+ .info-icon.padded
+ include ../source/assets/ico/ico-calendar.svg
+
+ - var start_date = ""
+ if(site.data.defaults.conference.is_online_only === true)
+ - start_date = date(day.date, config.date_format_hero_online)
+ else
+ - start_date = date(day.date, config.date_format_hero)
+
+ .info__date(id=the_id)
+ time(datetime=day_date) !{start_date}
+
+ table.table.is-fullwidth.is-hoverable
+ tbody
+ //- we transform the talks into an array (needed for sorting)
+ - const items = []
+ each talk, key in day.talks
+ - items.push(talk)
+ //- order the array by start times
+ - items.sort((a, b) => (a.start_datetime > b.start_datetime) ? 1 : -1)
+
+ //- per ogni start_datetime una riga nella tabella
+ - const datetimes = items.map(item => item.start_datetime).filter((value, index, self) => self.indexOf(value) === index).sort((a, b) => (a > b) ? 1 : -1)
+
+ //- loop 1: datetimes
+ - var row_items = []
+ each datetime in datetimes
+ - row_items[datetime] = []
+ //- loop 2: "talks" in each datetime series
+ each item in items
+ if(item.start_datetime == datetime)
+ - row_items[datetime].push(item)
+ //- end loop 2
+
+ - var cell_colspan = 1
+ - var cell_rowspan = 1
+ - var cell_style = ""
+ - var cell_classes = ""
+ - var previous_duration = 0
+ - var current_duration = 0
+
+ //- &calculate_rowspan
+ //- [AS] qui si creano i presupposti per dare colspan > 1 agli item che durano più del normale (x es. workshop)
+ //- vorremmo dare un'occhiata alla riga successiva per capire quale sia la durata massima dei talk
+ each datetime, index in datetimes
+ - cell_rowspan = 1
+ //- se esiste (non è undefined) una prossima riga...
+ if(datetimes[index+1] !== undefined)
+ - for (let i = 0; i < no_tracks; i++)
+ //- se esiste la colonna `i` nella prossima riga...
+ if(row_items[datetimes[index+1]][i] !== undefined)
+ //- se la *riga corrente* esiste ed esiste la corrispondente colonna...
+ if(row_items[datetimes[index]] !== undefined)
+ if(row_items[datetimes[index]][i] !== undefined)
+ //- ...allora aggiungiamo all'oggetto l'attributo rowspan...
+ - row_items[datetimes[index]][i].rowspan = cell_rowspan
+ //if(row_items[datetimes[index+1]][i].item_type == 'talk' || row_items[datetimes[index+1]][i].item_type == 'workshop' || row_items[datetimes[index+1]][i].item_type == 'other')
+ // //- ...ma aumentiamo effettivamente il *valore* di cell_rowspan solo passando alla riga successiva
+ // - cell_rowspan++
+
+ //- loop datetimes
+ each datetime, index in Object.keys(row_items)
+
+ tr
+ if(row_items[datetime][0].item_type == 'talk' || row_items[datetime][0].item_type == 'workshop' || row_items[datetime][0].item_type == 'other')
+
+ - for (let i = 0; i < no_tracks; i++)
+ //- qui si verifica l'effettiva durata dell'item. se non è maggiore della durata dell'item corrispondente nella riga precedente, non verrà creata una cella vuota sotto di lui, in modo che possa sfruttare il proprio rowspan
+ if(row_items[datetime][i] !== undefined)
+ - var start = new Date(row_items[datetime][i].start_datetime)
+ - var end = new Date(row_items[datetime][i].end_datetime)
+ - current_duration = end - start
+
+ //- qui si creano celle vuote solo dove servono effettivamente
+ if(row_items[datetime][i] === undefined && current_duration <= previous_duration)
+ - row_items[datetime][i] = {'track': {'id': i}, 'item_type': 'empty'}
+
+ - ordered_row_items = row_items[datetime].sort((a, b) => (a.track.id > b.track.id) ? 1 : -1)
+
+ //- loop in single row
+ each row_item in ordered_row_items
+ - cell_colspan = 1
+ - cell_style = ""
+ - cell_classes = ""
+
+ if row_item.item_type === 'empty'
+ td(colspan=cell_colspan style=cell_style).empty-item
+ span
+ - continue
+
+ if(row_item.item_type == "service" || row_item.item_type == "keynote")
+ - cell_colspan = no_tracks
+ else
+ - cell_style = `width: calc(100% / ${no_tracks})`
+ - cell_classes += " has-background"
+ //- recuperiamo l'attributo `rowspan` (attenzione: non viene peso dal file YML ed esiste *solo* per gli item cui è stato aggiunto in *calculate_rowspan)
+ - cell_rowspan=row_item.rowspan
+
+ if(row_item.item_type == 'service')
+ td(colspan=cell_colspan style=cell_style class=cell_classes)
+
+ time(datetime=row_item.start_datetime) !{time(row_item.start_datetime, config.time_format_schedule)} - !{time(row_item.end_datetime, config.time_format_schedule)}
+ br
+
+ strong !{row_item.talk_title}
+
+ if(row_item.service_icon)
+ if(row_item.service_icon == "coffee")
+ include ../source/assets/ico/ico-coffee.svg
+ if(row_item.service_icon == "cutlery")
+ include ../source/assets/ico/ico-cutlery.svg
+ if(row_item.service_icon == "glass")
+ include ../source/assets/ico/ico-glass.svg
+ if(row_item.service_icon == "bolt")
+ include ../source/assets/ico/ico-bolt.svg
+
+ br
+
+ if(row_item.host_name)
+ span !{row_item.host_name}
+
+ if(row_item.speakers)
+ each speaker in row_item.speakers
+ span !{speaker.speaker_name}
+
+ else if(row_item.item_type == 'keynote')
+ td(colspan=cell_colspan style=cell_style class=cell_classes)
+
+ time(datetime=row_item.start_datetime) !{time(row_item.start_datetime, config.time_format_schedule)} - !{time(row_item.end_datetime, config.time_format_schedule)}
+
+ br
+
+ strong Keynote
+ if(row_item.talk_title)
+ | : !{row_item.talk_title}
+
+ br
+
+ if(row_item.host_name)
+ span !{row_item.host_name}
+
+ if(row_item.speakers)
+ each speaker in row_item.speakers
+ span !{speaker.speaker_name}
+ if(speaker.speaker_role)
+ span !{speaker.speaker_role}
+
+ if(row_item.talk_description)
+ br
+ | !{row_item.talk_description}
+
+ if(row_item.item_type == 'talk' || row_item.item_type == 'workshop' || row_item.item_type == 'other')
+ - current_item_track = row_item['track']
+
+ if(row_item.track.title == current_item_track.title)
+ td(colspan=cell_colspan style=cell_style class=cell_classes rowspan=cell_rowspan)
+
+ if(row_item.item_type == 'talk')
+ time(datetime=row_item.start_datetime) !{time(row_item.start_datetime, config.time_format_schedule)} - !{time(row_item.end_datetime, config.time_format_schedule)}
+
+ br
+
+ if (no_tracks > 1)
+ span.track-title !{row_item.track.title}
+
+ br
+
+ //- prendere la key (es. "talk_5") dalla lista originale, usarla per popolare l'ancora del link a talks_speakers
+ - the_key = ""
+ each talk, key in day.talks
+ if(talk.item_type == "talk" && talk.start_datetime == datetime && talk.start_datetime == row_item.start_datetime && talk.track.id == row_item.track.id)
+ - the_key = key
+
+ - talk_url = url_for("talks_speakers") + "#" + the_key
+ span(id=the_key).talk-anchor-pre
+ strong.talk-anchor
+ a(href=talk_url) !{row_item.talk_title}
+
+ br
+
+ if(row_item.host_name)
+ span !{row_item.host_name}
+
+ if(row_item.speakers)
+ each speaker in row_item.speakers
+ span !{speaker.speaker_name}
+
+ else if(row_item.item_type == 'workshop')
+ time(datetime=row_item.start_datetime) !{time(row_item.start_datetime, config.time_format_schedule)} - !{time(row_item.end_datetime, config.time_format_schedule)}
+
+ br
+
+ span.track-title !{row_item.track.title}
+
+ br
+
+ strong Workshop
+ if(row_item.talk_title)
+ | : !{row_item.talk_title}
+
+ br
+
+ if(row_item.host_name)
+ span !{row_item.host_name}
+
+ if(row_item.speakers)
+ each speaker in row_item.speakers
+ span !{speaker.speaker_name}
+ if(speaker.speaker_role)
+ span !{speaker.speaker_role}
+
+ if(row_item.talk_description)
+ br
+ | !{row_item.talk_description}
+
+ else if(row_item.item_type == 'other')
+ time(datetime=row_item.start_datetime) !{time(row_item.start_datetime, config.time_format_schedule)} - !{time(row_item.end_datetime, config.time_format_schedule)}
+
+ br
+
+ span.track-title !{row_item.track.title}
+
+ br
+
+ if(row_item.talk_title)
+ strong !{row_item.talk_title}
+
+ if(row_item.talk_description)
+ br
+ | !{row_item.talk_description}
+
+ //- prima di passare alla prossima riga si switcha la duration per usarla alla prossima iterazione
+ - previous_duration = current_duration
+ - current_duration = 0
+ //- end loop in single row
+ //-
+ //- end loop datetimes
+
+ //- imported components
+ include components/newsletter/newsletter
+ if(site.data.defaults.conference.sponsors_visible)
+ include components/sponsors/sponsors
+ if site.data.defaults.conference.community_partners
+ include components/community_partners/community_partners
diff --git a/themes/grusp_conf/layout/scholarships.pug b/themes/grusp_conf/layout/scholarships.pug
new file mode 100644
index 0000000..2b082c0
--- /dev/null
+++ b/themes/grusp_conf/layout/scholarships.pug
@@ -0,0 +1,71 @@
+extends includes/layout.pug
+
+block content
+ - contact_url = "mailto:" + site.data.defaults.conference.contact_email
+ section(id="scholarships")
+ include includes/_breadcrumbs.pug
+
+ .container
+ .inner
+ .title-container
+ include ../source/assets/ico/ico-scholarship.svg
+ h1(role="heading" aria-level="1").title-is-1 !{site.data.page_scholarships.intro.main_title}
+ p
+ strong !{site.data.page_scholarships.intro.content_1}
+ p.text_bigger !{site.data.page_scholarships.intro.content_2}
+ p !{site.data.page_scholarships.intro.content_3}
+ .container.container__short-version
+ .inner
+ if site.data.page_scholarships.short_version.title
+ h2(role="heading" aria-level="2").title.is-2 !{site.data.page_scholarships.short_version.title}
+ p !{site.data.page_scholarships.short_version.content_1}
+ if(site.data.page_scholarships.short_version.content_2)
+ p
+ strong !{site.data.page_scholarships.short_version.content_2}
+ if(site.data.page_scholarships.short_version.content_3)
+ p !{site.data.page_scholarships.short_version.content_3}
+ if(site.data.page_scholarships.short_version.content_4)
+ p !{site.data.page_scholarships.short_version.content_4}
+ if(site.data.page_scholarships.short_version.content_5)
+ p !{site.data.page_scholarships.short_version.content_5}
+ if(site.data.page_scholarships.short_version.content_6)
+ p !{site.data.page_scholarships.short_version.content_6}
+ .container.container__long-version
+ .inner
+ if site.data.page_scholarships.long_version.title
+ h2(role="heading" aria-level="2").title.is-2 !{site.data.page_scholarships.long_version.title}
+ h3(role="heading" aria-level="3") !{site.data.page_scholarships.long_version.content_1}
+ p !{site.data.page_scholarships.long_version.content_2_beginning}
+ a(href=site.data.page_scholarships.long_version.content_2_link_url target="_blank" rel="noopener noreferrer external" role="button" aria-label=content_2_link_label) !{site.data.page_scholarships.long_version.content_2_link_label}
+ | !{site.data.page_scholarships.long_version.content_2_ending}
+ h3(role="heading" aria-level="3") !{site.data.page_scholarships.long_version.content_3}
+ p !{site.data.page_scholarships.long_version.content_4}
+ h3(role="heading" aria-level="3") !{site.data.page_scholarships.long_version.content_5}
+ p !{site.data.page_scholarships.long_version.content_6}
+ a(href=contact_url role="button" rel="external" aria-label="contact email") !{site.data.defaults.conference.contact_email}
+
+ if (site.data.sponsors.diversity)
+ .container.container_diversity-partners
+ .inner
+ h4(role="heading" aria-level="4").title.is-4 !{site.data.page_scholarships.diversity_sponsors_title}
+ each sponsor in site.data.sponsors.diversity
+ .column
+ - filename = "/img/logos/"+sponsor.logo_filename
+ a(href=sponsor.site_url target="_blank" rel="noopener noreferrer external" role="button" aria-label=sponsor.name)
+ img(src=filename alt=sponsor.name)
+ script(type="application/ld+json").
+ {
+ "sponsor":
+ {
+ "type": "Organization",
+ "name": "#{sponsor.name}",
+ "url": "#{sponsor.site_url}"
+ }
+ }
+
+ //- imported components
+ include components/newsletter/newsletter
+ if(site.data.defaults.conference.sponsors_visible)
+ include components/sponsors/sponsors
+ if site.data.defaults.conference.community_partners
+ include components/community_partners/community_partners
diff --git a/themes/grusp_conf/layout/sponsor.pug b/themes/grusp_conf/layout/sponsor.pug
new file mode 100644
index 0000000..159ec77
--- /dev/null
+++ b/themes/grusp_conf/layout/sponsor.pug
@@ -0,0 +1,135 @@
+extends includes/layout.pug
+
+block content
+ - contact_url = "mailto:" + site.data.defaults.conference.contact_email
+ section(id="partners_page")
+ include includes/_breadcrumbs.pug
+
+ .container
+ .inner
+ h1(role="heading" aria-level="1").title-is-1= page.title
+ p.is-size-4.has-text-weight-bold !{site.data.page_sponsor.intro.slogan_1}
+ p.is-size-4.has-text-weight-bold !{site.data.page_sponsor.intro.slogan_2}
+ p !{site.data.page_sponsor.intro.content_1}
+ p !{site.data.page_sponsor.intro.content_2}
+ if(site.data.page_sponsor.intro.content_3)
+ p !{site.data.page_sponsor.intro.content_3}
+ .container.background-light.is-centered
+ .inner
+ h2(role="heading" aria-level="2").title.is-2 !{site.data.page_sponsor.block_2.title}
+ p.is-size-4.has-text-weight-bold !{site.data.page_sponsor.block_2.slogan}
+ .columns.has-text-left
+ .column
+ h3(role="heading" aria-level="3").title.is-3 !{site.data.page_sponsor.block_2.subtitle_1}
+ p !{site.data.page_sponsor.block_2.content_1}
+ .column
+ h3(role="heading" aria-level="3").title.is-3 !{site.data.page_sponsor.block_2.subtitle_2}
+ p !{site.data.page_sponsor.block_2.content_2}
+ //- count number of occupied slots (number of items in each sponsorship level in 'sponsors.yml')
+ //- at each sponsorship level, the number of available slots is calculated based on the maximum number of slots specified in 'page_sponsor.yml' for the level
+ - occupied_slots_main = 0
+ - occupied_slots_diamond = 0
+ - occupied_slots_platinum = 0
+ - occupied_slots_gold = 0
+ - occupied_slots_silver = 0
+ - occupied_slots_bronze = 0
+ if site.data.sponsors.main
+ each sponsor in site.data.sponsors.main
+ - occupied_slots_main++
+ if site.data.sponsors.diamond
+ each sponsor in site.data.sponsors.diamond
+ - occupied_slots_diamond++
+ if site.data.sponsors.platinum
+ each sponsor in site.data.sponsors.platinum
+ - occupied_slots_platinum++
+ if site.data.sponsors.gold
+ each sponsor in site.data.sponsors.gold
+ - occupied_slots_gold++
+ if site.data.sponsors.silver
+ each sponsor in site.data.sponsors.silver
+ - occupied_slots_silver++
+ if site.data.sponsors.bronze
+ each sponsor in site.data.sponsors.bronze
+ - occupied_slots_bronze++
+ .container
+ .inner.options-container
+ each level in site.data.page_sponsor.levels
+ .level-block
+ .level-block__intro
+ if level.name == "Main"
+ - available_slots = level.available_slots - occupied_slots_main
+ if level.name == "Diamond"
+ - available_slots = level.available_slots - occupied_slots_diamond
+ if level.name == "Platinum"
+ - available_slots = level.available_slots - occupied_slots_platinum
+ if level.name == "Gold"
+ - available_slots = level.available_slots - occupied_slots_gold
+ if level.name == "Silver"
+ - available_slots = level.available_slots - occupied_slots_silver
+ if level.name == "Bronze"
+ - available_slots = level.available_slots - occupied_slots_bronze
+ h3.is-title.is-3 !{level.name}
+ p.is-size-1.has-text-weight-bold € !{number_format(level.amount)}
+ p !{level.vat_label}
+ p !{available_slots} available slots
+
+ if level.description_1
+ .triangle
+ else
+ if level.description_2
+ .triangle.triangle_description_2
+ else
+ if level.description_3
+ .triangle.triangle_description_3
+ else
+ if level.description_4
+ .triangle.triangle_description_4
+ else
+ if level.description_5
+ .triangle.triangle_description_5
+ else
+ if level.description_6
+ .triangle.triangle_description_6
+
+ if level.description_1
+ .level-block__description_1
+ ul
+ each item in level.description_1
+ li !{item}
+ if level.description_2
+ .level-block__description_2
+ ul
+ each item in level.description_2
+ li !{item}
+ if level.description_3
+ .level-block__description_3
+ ul
+ each item in level.description_3
+ li !{item}
+ if level.description_4
+ .level-block__description_4
+ ul
+ each item in level.description_4
+ li !{item}
+ if level.description_5
+ .level-block__description_5
+ ul
+ each item in level.description_5
+ li !{item}
+ if level.description_6
+ .level-block__description_6
+ ul
+ each item in level.description_6
+ li !{item}
+ if level.description_7
+ .level-block__description_7
+ ul
+ each item in level.description_7
+ li !{item}
+
+ //- imported components
+ include components/newsletter/newsletter
+ if(site.data.defaults.conference.sponsors_visible)
+ include components/sponsors/sponsors
+ if site.data.defaults.conference.community_partners
+ include components/community_partners/community_partners
\ No newline at end of file
diff --git a/themes/grusp_conf/layout/talks_speakers.pug b/themes/grusp_conf/layout/talks_speakers.pug
new file mode 100644
index 0000000..5a66081
--- /dev/null
+++ b/themes/grusp_conf/layout/talks_speakers.pug
@@ -0,0 +1,214 @@
+extends includes/layout.pug
+
+block content
+ section(id="speakers")
+ include includes/_breadcrumbs.pug
+
+ //- first we create a unique list of speaker names. it will be used for both assigning the right anchor (see right below) for the talk titles (linked from schedule) and the secondary menu items, and for creating the secondary menu itself.
+ //- EXPLANATION: the items in the secondary menu must point to the title of the talk where the first occurrence of the speaker is found.
+ - const var_speakers = []
+ //- also, we count the days - useful for the page layout
+ - var no_days = 0
+ each day in site.data.talks_speakers.days
+ - no_days++
+ each talk in day.talks
+ if(talk.speakers)
+ each speaker in talk.speakers
+ if(speaker.speaker_in_speaker_lists === true)
+ - var_speakers.push(speaker)
+ - const filtered_speaker_names = var_speakers.map(speaker => speaker.speaker_name).filter((value, index, self) => self.indexOf(value) === index).sort((a, b) => (a > b) ? 1 : -1)
+
+ //- we count the number of tracks in order to know if we have to add the track title to the talks' info row
+ - no_tracks = 0
+ each track in site.data.talks_speakers.tracks
+ - no_tracks++
+
+ .container
+ .inner
+ .title-container
+ - title_classes = ""
+ if(no_days > 1)
+ - title_classes += "is-centered"
+ h1(class=title_classes role="heading" aria-level="1").title-is-1= page.title
+ else
+ - title_classes += "has-text-left"
+ .columns
+ .column
+ h1(class=title_classes role="heading" aria-level="1").title-is-1= page.title
+ .column.has-text-right
+ .row-info
+ .info-icon
+
+ if(site.data.defaults.conference.is_online_only === true)
+ include ../source/assets/ico/ico-online-conference.svg
+ else
+ include ../source/assets/ico/ico-where.svg
+
+
+ if(site.data.defaults.conference.is_online_only === true)
+ .info__location !{site.data.defaults.conference.online_location}
+ else
+ .info__location !{site.data.defaults.conference.city}
+
+ | |
+
+ .info-icon.padded
+ include ../source/assets/ico/ico-calendar.svg
+
+ - var start_date = ""
+ if(site.data.defaults.conference.is_online_only === true)
+ - start_date = date(site.data.defaults.conference.date, config.date_format_hero_online)
+ else
+ - start_date = date(site.data.defaults.conference.date, config.date_format_hero)
+
+ .info__date
+ time(datetime=site.data.defaults.conference.date) !{start_date}
+ //- links to every day in page if there is more than 1 day
+ if(no_days > 1)
+ .container.date-menu
+ .inner
+ each day in site.data.talks_speakers.days
+ - anchor = `#${day.title}`
+ a(role="button" href=anchor).button.is-rounded.is-primary.is-medium !{day.title}
+
+ //- day title band if there is more than 1 day
+ each day in site.data.talks_speakers.days
+ if(no_days > 1)
+ .container.date-holder
+ .inner
+
+ - var the_date = ""
+ if(site.data.defaults.conference.is_online_only === true)
+ - the_date = date(day.date, config.date_format_hero_online)
+ else
+ - the_date = date(day.date, config.date_format_hero)
+
+ - the_id = day.title
+ .row-info(id=the_id)
+
+ .info-icon
+ if(site.data.defaults.conference.is_online_only === true)
+ include ../source/assets/ico/ico-online-conference.svg
+ else
+ include ../source/assets/ico/ico-where.svg
+
+ if(site.data.defaults.conference.is_online_only === true)
+ .info__location !{site.data.defaults.conference.online_location}
+ else
+ .info__location !{site.data.defaults.conference.city}
+
+ | |
+
+ .info-icon.padded
+ include ../source/assets/ico/ico-calendar.svg
+
+ .info__date
+ time(datetime=site.data.defaults.conference.date) !{the_date}
+
+ each talk, key in day.talks
+ //- verifichiamo se tra gli speaker ce n'è almeno uno che deve comparire
+ - include_talk = false
+ if(talk.speakers)
+ each speaker in talk.speakers
+ if(speaker.speaker_in_speaker_lists === true)
+ - include_talk = true
+
+ if(include_talk === true)
+ .container.has-dynamic-background
+ .inner
+ if(talk.start_datetime && talk.end_datetime)
+ .row-info
+ if(no_tracks > 1)
+ if(talk.track)
+ strong !{talk.track.title}
+ .info-icon.padded
+ else
+ .info-icon
+ include ../source/assets/ico/ico-clock.svg
+ - start_time = date(talk.start_datetime, config.time_format_schedule)
+ - end_time = date(talk.end_datetime, config.time_format_schedule)
+ .info__date
+ time(datetime=talk.start_datetime) !{start_time}
+ | -
+ time(datetime=talk.end_datetime) !{end_time}
+
+ if(no_days > 1)
+ - curr_day = date(talk.start_datetime, config.date_format_extended)
+ .info-icon.padded
+ include ../source/assets/ico/ico-calendar.svg
+ .info__date !{curr_day}
+
+ //- the key to the talk will be user as the ID of the anchor: same in secondary menu below
+ - schedule_url = url_for("schedule") + "#" + key
+
+ h2(role="heading" aria-level="2" id=key).is-title.is-2
+ a(href=schedule_url).schedule-anchor !{talk.talk_title}
+ if(talk.speakers)
+ each speaker in talk.speakers
+ h3(id=slugify(speaker.speaker_name))
+ p !{talk.talk_description}
+ if(talk.talk_video_url)
+ .video-container
+ iframe(type="text/html" src=talk.talk_video_url frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen width="400px" height="225px")
+ if(talk.speakers)
+ each speaker in talk.speakers
+ if(speaker.speaker_in_speaker_lists === true)
+ .block-speaker
+ .has-border
+ .columns
+ .column.column_speaker
+ - filename = `/img/speakers/${speaker.speaker_pic_filename}`
+ .card.speaker-card
+ .card-image
+ img(src=filename role="figure" aria-label=speaker.speaker_name alt=speaker.speaker_name)
+ .row__social
+ if(speaker.speaker_github_url)
+ a(role="button" href=speaker.speaker_github_url rel="external noopener noreferrer" aria-label="github profile")
+ .social-icon
+ include ../source/assets/ico/ico-social-github.svg
+ if(speaker.speaker_twitter_url)
+ a(role="button" href=speaker.speaker_twitter_url rel="external noopener noreferrer" aria-label="twitter profile")
+ .social-icon
+ include ../source/assets/ico/ico-social-twitter.svg
+ if(speaker.speaker_linkedin_url)
+ a(role="button" href=speaker.speaker_linkedin_url rel="external noopener noreferrer" aria-label="linkedin profile")
+ .social-icon
+ include ../source/assets/ico/ico-social-linkedin.svg
+ if(speaker.speaker_instagram_url)
+ a(role="button" href=speaker.speaker_instagram_url rel="external noopener noreferrer" aria-label="instagram profile")
+ .social-icon
+ include ../source/assets/ico/ico-social-instagram.svg
+ if(speaker.speaker_mastodon_url)
+ a(role="button" href=speaker.speaker_mastodon_url rel="external noopener noreferrer" aria-label="mastodon profile")
+ .social-icon
+ include ../source/assets/ico/ico-social-mastodon.svg
+ .column
+ .columns.speaker-info
+ .column
+ h3(role="heading" aria-level="3" id=speaker.speaker_name).speaker-name !{speaker.speaker_name}
+ .column
+ p !{speaker.speaker_role}
+ .columns.speaker-bio
+ .column
+ p
+ | !{speaker.speaker_bio}
+
+ script(type="text/javascript" src='/assets/js/speakers_menu.js')
+ aside(id="secondary_menu").menu.secondary-menu
+ .secondary-menu-button-container
+ a(href="#menu" id="secondary_menu_button" role="navigation" itemscope="itemscope" itemtype="https://schema.org/SiteNavigationElement" aria-label="Speakers menu").secondary-menu-button.is-active
+ .chevron(id="speaker_menu_chevron")
+ ul.menu-list
+ each name in filtered_speaker_names
+ - the_id = ""
+ each day in site.data.talks_speakers.days
+ each talk, key in day.talks
+ if(talk.speakers)
+ each speaker in talk.speakers
+ if(speaker.speaker_name === name)
+ - the_id = key
+ - target_href = "#" + the_id
+ li
+ a(href=target_href role="button" aria-label=name).secondary-menu-list-item !{name}
+
+ include components/newsletter/newsletter.pug
diff --git a/themes/grusp_conf/layout/tickets.pug b/themes/grusp_conf/layout/tickets.pug
new file mode 100644
index 0000000..924b437
--- /dev/null
+++ b/themes/grusp_conf/layout/tickets.pug
@@ -0,0 +1,17 @@
+extends includes/layout.pug
+
+block content
+ section(id="tickets_page")
+ include includes/_breadcrumbs.pug
+
+ .container
+ .inner
+ h1(role="heading" aria-level="1").title-is-1= page.title
+ tito-widget(event=site.data.defaults.conference.tito.event)
+
+ //- imported components
+ include components/newsletter/newsletter
+ if(site.data.defaults.conference.sponsors_visible)
+ include components/sponsors/sponsors
+ if site.data.defaults.conference.community_partners
+ include components/community_partners/community_partners
diff --git a/themes/grusp_conf/layout/welcome.pug b/themes/grusp_conf/layout/welcome.pug
new file mode 100644
index 0000000..c59ce20
--- /dev/null
+++ b/themes/grusp_conf/layout/welcome.pug
@@ -0,0 +1,86 @@
+extends includes/layout.pug
+
+block content
+ - contact_url = "mailto:" + site.data.defaults.conference.contact_email
+ section(id="welcome")
+ include includes/_breadcrumbs.pug
+
+ .container
+ .inner
+ .title-container
+ h1(role="heading" aria-level="1").title-is-1 !{site.data.page_welcome.intro.main_title}
+ p !{site.data.page_welcome.intro.content_1}
+ p !{site.data.page_welcome.intro.content_2}
+ .container
+ .columns.inner
+ .column
+ p
+ strong !{site.data.defaults.conference.past_editions_pre}
+ p
+ each item in site.data.defaults.conference.past_editions
+ - url = "https://" + item + "." + site.data.defaults.conference.base_url
+ a(href=url target="_blank" rel="noopener noreferrer").past-edition !{item}
+ .column
+ include includes/_social.pug
+
+ section.section_nopadding.welcome__container_moreinfo
+ .inner
+ .summary-blocks
+ - page_key = "welcome"
+ if(theme[page_key + '_submenu'])
+ each sub_label, sub_key in theme[page_key + '_submenu']
+ - subpage_url = `${url_for(site.url)}${page_key}/${sub_key}.html`
+ - aria_label = sub_label + " page"
+ - ico_uri = `../source/assets/ico/ico-${sub_key}.svg`
+ .block
+ .row-info
+ .info-icon
+ if(sub_key === "about")
+ include ../source/assets/ico/ico-about.svg
+ - the_title = site.data.page_welcome.info_about.title
+ - the_content = site.data.page_welcome.info_about.content
+ if(sub_key === "coc")
+ include ../source/assets/ico/ico-coc.svg
+ - the_title = site.data.page_welcome.info_coc.title
+ - the_content = site.data.page_welcome.info_coc.content
+ if(sub_key === "safety")
+ include ../source/assets/ico/ico-safety.svg
+ - the_title = site.data.page_welcome.info_safety.title
+ - the_content = site.data.page_welcome.info_safety.content
+ if(sub_key === "scholarships")
+ include ../source/assets/ico/ico-scholarship.svg
+ - the_title = site.data.page_welcome.info_scholarships.title
+ - the_content = site.data.page_welcome.info_scholarships.content
+ if(sub_key === "cfp")
+ include ../source/assets/ico/ico-cfp.svg
+ - the_title = site.data.page_welcome.info_cfp.title
+ - the_content = site.data.page_welcome.info_cfp.content
+ if(sub_key === "where")
+ include ../source/assets/ico/ico-where.svg
+ - the_title = site.data.page_welcome.info_venue.title
+ - the_content = site.data.page_welcome.info_venue.content
+ .info__location
+ a(href=url_for(subpage_url) aria-label=aria_label)
+ span !{the_title}
+ p !{the_content}
+ p
+ a(href=url_for(subpage_url) aria-label=aria_label) !{site.data.page_welcome.readmore_label}
+ .block
+ .row-info
+ .info-icon
+ include ../source/assets/ico/ico-ticket.svg
+ - the_title = site.data.page_welcome.info_ticket.title
+ - the_content = site.data.page_welcome.info_ticket.content
+ .info__location
+ a(href=url_for("tickets") aria-label=site.data.defaults.conference.menu_buy_tickets_label)
+ span !{the_title}
+ p !{the_content}
+ p
+ a(href=url_for("tickets") role="button" aria-label=site.data.defaults.conference.menu_buy_tickets_label) !{site.data.page_welcome.info_ticket.readmore_label}
+
+ //- imported components
+ include components/newsletter/newsletter
+ if(site.data.defaults.conference.sponsors_visible)
+ include components/sponsors/sponsors
+ if site.data.defaults.conference.community_partners
+ include components/community_partners/community_partners
\ No newline at end of file
diff --git a/themes/grusp_conf/layout/where.pug b/themes/grusp_conf/layout/where.pug
new file mode 100644
index 0000000..6090418
--- /dev/null
+++ b/themes/grusp_conf/layout/where.pug
@@ -0,0 +1,116 @@
+extends includes/layout.pug
+
+block content
+ - contact_url = "mailto:" + site.data.defaults.conference.contact_email
+ section(id="venue")
+
+ - classes = "venue__header"
+ if(site.data.defaults.conference.is_online_only === true)
+ - classes += " is-online-conference"
+
+ div(class=classes)
+ .inner
+
+ - title = ""
+ if(site.data.defaults.conference.is_online_only === true)
+ - title = site.data.defaults.conference.online_location_title
+ else
+ - title = site.data.page_where.header.title_pre + " " + site.data.defaults.conference.city
+
+ h2(role="header" aria-level="2").is-title.is-2 !{title}
+ if(site.data.defaults.conference.venue_img_credits)
+ .image-credits !{site.data.defaults.conference.venue_img_credits}
+
+ include includes/_breadcrumbs.pug
+
+ .container
+ .inner
+ .title-container
+ if(site.data.defaults.conference.is_online_only === true)
+ include ../source/assets/ico/ico-online-conference-120.svg
+ else
+ include ../source/assets/ico/ico-where-120.svg
+
+ h1(role="heading" aria-level="1").is-title-is-1 !{site.data.page_where.intro.main_title}
+ p !{site.data.page_where.intro.content_1}
+ if(site.data.page_where.intro.content_2)
+ p !{site.data.page_where.intro.content_2}
+ .venue-container__more
+ .inner
+ h2(role="heading" aria-level="2").is-title.is-2 !{site.data.page_where.city_info.title}
+ if(site.data.page_where.city_info.subtitle_1)
+ h3(role="heading" aria-level="3").is-title.is-3 !{site.data.page_where.city_info.subtitle_1}
+ p !{site.data.page_where.city_info.description_1}
+ if(site.data.page_where.city_info.subtitle_2)
+ h3(role="heading" aria-level="3").is-title.is-3 !{site.data.page_where.city_info.subtitle_2}
+ if(site.data.page_where.city_info.description_2)
+ p !{site.data.page_where.city_info.description_2}
+
+ if(site.data.defaults.conference.is_online_only === false)
+ if(site.data.page_where.map)
+ .container.container__map
+ .inner
+ h3(role="heading" aria-level="3").is-title.is-3 !{site.data.page_where.map.title}
+ .iframe-container
+ .iframe-holder
+ iframe(type="text/html" src=site.data.page_where.map.map_url frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen width="800px" height="450px")
+
+ if(site.data.defaults.conference.is_online_only === false)
+ .container.container__hotels
+ .inner
+ .row-info
+ .info-icon
+ include ../source/assets/ico/ico-hotel.svg
+ h3(role="heading" aria-level="3").is-title.is-3 !{site.data.page_where.hotels.title}
+ p !{site.data.page_where.hotels.intro}
+ .columns
+ each hotel in site.data.page_where.hotels.agreements
+ .column
+ h4(role="heading" aria-level="4").is-title.is-4 !{hotel.name}
+ p
+ a(href=hotel.maps_url role="button" target="_blank" rel="external noopener noreferrer" aria-label=site.data.page_where.address_aria_label) !{hotel.address}
+ if(hotel.website)
+ a(href=hotel.website role="button" target="_blank" rel="external noopener noreferrer" aria-label=site.data.page_where.website_aria_label) !{hotel.website}
+ if(hotel.phone)
+ - phone_url = "tel:" + hotel.phone
+ p
+ a(href=phone_url role="button" target="_blank" rel="external noopener noreferrer" aria-label=site.data.page_where.phone_aria_label) !{hotel.phone_label}
+ if(hotel.email)
+ - email_url = "mailto:" + hotel.email
+ p
+ a(href=email_url role="button" target="_blank" rel="external noopener noreferrer" aria-label=site.data.page_where.email_aria_label) !{hotel.email}
+ script(type="application/ld+json").
+ {
+ "offers":
+ {
+ "@type": "Offer",
+ "description": "Hotel agreement: we have conventions with hotels in the area",
+ "availability": "https://schema.org/LimitedAvailability",
+ "location":
+ {
+ "@type": "Place",
+ "name": "#{hotel.name}",
+ "url": "#{hotel.website}",
+ "address":
+ {
+ "@type": "PostalAddress",
+ "addressLocality": "#{site.data.defaults.conference.md_city}",
+ "addressRegion": "#{site.data.defaults.conference.md_province}",
+ "postalCode": "#{site.data.defaults.conference.md_postal_code}",
+ "streetAddress": "#{hotel.address}"
+ },
+ "contactPoint": [
+ {
+ "@type": "contactPoint",
+ "email": "mailto:#{hotel.email}"
+ }]
+ }
+ }
+ }
+
+ //- imported components
+ include components/newsletter/newsletter
+ if(site.data.defaults.conference.sponsors_visible)
+ include components/sponsors/sponsors
+ if site.data.defaults.conference.community_partners
+ include components/community_partners/community_partners
\ No newline at end of file
diff --git a/themes/grusp_conf/layout/workshop_single.pug b/themes/grusp_conf/layout/workshop_single.pug
new file mode 100644
index 0000000..14e981f
--- /dev/null
+++ b/themes/grusp_conf/layout/workshop_single.pug
@@ -0,0 +1,198 @@
+extends includes/layout.pug
+
+block content
+ section(id="page-workshop").section_nopadding
+
+ each ws in site.data.workshop.workshops
+ if ws.ws_id == page.ws_id
+
+ - classes = "workshop-single__header"
+ if(site.data.defaults.conference.is_online_only === true)
+ - classes += " is-online-conference"
+
+ div(class=classes)
+ .inner
+ h2(role="header" aria-level="2").is-title.is-2 !{ws.page_title}
+ a(role="button" href=ws.ticket_url aria-label=ws.ticket_label target="_blank" rel="external noopener noreferrer").button.is-medium.is-rounded.is-primary !{ws.ticket_label}
+ if(ws.workshop_img_credits)
+ .image-credits !{ws.workshop_img_credits}
+
+ include includes/_breadcrumbs.pug
+
+ .workshop-single__container
+ section(id="workshop-single__intro").section_nopadding.workshop-single__intro
+ .inner
+ .columns.row-info
+ .column
+ .info-icon
+ if(ws.online_location)
+ include ../source/assets/ico/ico-online-conference.svg
+ else
+ include ../source/assets/ico/ico-where.svg
+
+ if(ws.online_location)
+ .info__location !{ws.online_location}
+ else
+ .info__location !{ws.location}
+
+ .column
+ .info-icon
+ include ../source/assets/ico/ico-calendar.svg
+
+ .info__date
+ - var start_date = ""
+ if(ws.date_text)
+ - start_date = ws.date_text
+ else if(site.data.defaults.conference.is_online_only === true)
+ - start_date = date(ws.date, config.date_format_hero_online)
+ else
+ - start_date = date(ws.date, config.date_format_hero)
+
+ time(datetime=ws.date) !{start_date}
+ .column
+ .info-icon
+ include ../source/assets/ico/ico-world.svg
+ .info__language !{ws.language}
+ h1(role="header" aria-level="1").is-title.is-1 !{ws.workshop_title}
+ .columns
+ .column
+ if(ws.collab)
+ p
+ strong !{ws.collab}
+ p
+ em !{ws.language_ext}
+ p !{ws.description_long}
+ a(role="button" href=ws.ticket_url aria-label=ws.ticket_label target="_blank" rel="external noopener noreferrer").button.is-medium.is-rounded.is-primary !{ws.ticket_label}
+ if(ws.trailer)
+ .column.is-one-third
+ iframe(type="text/html" src=ws.trailer_url frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen width="400px" height="225px")
+ p
+ section(id="workshop-single__teacher").section_nopadding.workshop-single__teacher
+ .inner
+ //- Nota: qui mettiamo il suffisso SOLO se il linguaggio NON è italiano. (se un giorno compare il tedesco siamo panati)
+ - title_suffix = ""
+ - teacher_count = 0
+ if(!ws.language.includes("italian"))
+ each teacher in ws.teachers
+ - teacher_count++
+ if(teacher_count > 1)
+ - title_suffix = "s"
+ h2(role="heading" aria-level="2").is-title.is-2 !{ws.teacher_title}!{title_suffix}
+ each teacher in ws.teachers
+ .columns
+ .column.is-four-fifths
+ h3(role="heading" aria-level="3") !{teacher.teacher_name}
+ p !{teacher.teacher_role}
+ if(teacher.teacher_org)
+ span.teacher-org !{teacher.teacher_org}
+ p !{teacher.teacher_bio}
+ .column
+ - filename = "/img/ws_teachers/"+teacher.pic_filename
+ .card.speaker-card
+ .card-image
+ img(src=filename role="figure" aria-label=teacher.teacher_name alt=teacher.teacher_name)
+
+ section(id="workshop-single__moreinfo").section_nopadding.workshop-single__moreinfo
+ .inner
+ h3(role="heading" aria-level="3").is-title.is-3 !{ws.topics_title}
+ ul
+ each topic in ws.topics
+ li !{topic}
+ h3(role="heading" aria-level="3").is-title.is-3 !{ws.addressees_title}
+ p !{ws.addressees_description}
+ h3(role="heading" aria-level="3").is-title.is-3 !{ws.requirements_title}
+ p !{ws.requirements_description}
+ h3(role="heading" aria-level="3").is-title.is-3 !{ws.useful_info_title}
+ p !{ws.useful_info_description}
+
+ section(id="workshop-single__cta").section_nopadding.workshop-single__cta
+ .inner
+ h3(role="heading" aria-level="3").is-title.is-3 !{ws.cta_title}
+ a(role="button" href=ws.ticket_url aria-label=ws.ticket_label target="_blank" rel="external noopener noreferrer").button.is-medium.is-rounded.is-primary !{ws.ticket_label}
+
+ section(id="workshop-single__summary").section_nopadding.workshop-single__summary
+ .inner
+ .summary-blocks
+ .block
+ .row-info
+ .info-icon
+
+ if(site.data.defaults.conference.is_online_only === true)
+ include ../source/assets/ico/ico-online-conference.svg
+ else
+ include ../source/assets/ico/ico-where.svg
+
+ .info__location
+ span !{ws.location_title}
+
+ strong !{ws.location_name}
+ br
+
+ if(site.data.defaults.conference.is_online_only === false)
+ a(role="button" href=ws.location_maps_url target="_blank" rel="external noopener noreferrer") !{ws.location_address}
+ br
+
+ if(ws.location_contact_phone)
+ - phone_url = `tel:${ws.location_contact_phone}`
+ a(role="button" href=phone_url target="_blank" rel="external noopener noreferrer") !{ws.location_contact_phone}
+ |
+ if(ws.location_contact_email)
+ | -
+ - email_url = `mailto:${ws.location_contact_email}`
+ a(role="button" href=email_url target="_blank" rel="external noopener noreferrer") !{ws.location_contact_email}
+ br
+ if(ws.location_contact_url)
+ a(role="button" href=ws.location_contact_url target="_blank" rel="external noopener noreferrer") !{ws.location_contact_url}
+
+ if(ws.location_additional_info)
+ p !{ws.location_additional_info}
+
+ .block
+ .row-info
+ .info-icon
+ include ../source/assets/ico/ico-calendar.svg
+ .info__location
+ span !{ws.whatandwhen_title}
+ strong
+ - var start_date = ""
+ if(site.data.defaults.conference.is_online_only === true)
+ - start_date = date(ws.date, config.date_format_hero_online)
+ else
+ - start_date = date(ws.date, config.date_format_hero)
+
+ //-time(datetime=ws.date) !{start_date}
+ //-br
+ //-- start_time = date(ws.date, config.time_format_schedule)
+ //-- end_time = date(ws.end_date, config.time_format_schedule)
+ //-time(datetime=ws.date) !{start_time}
+ //-| -
+ //-time(datetime=ws.end_date) !{end_time}
+ if(ws.whatandwhen_additional_info)
+ p !{ws.whatandwhen_additional_info}
+ .block
+ .row-info
+ .info-icon
+ include ../source/assets/ico/ico-world.svg
+ .info__location
+ span !{ws.language_title}
+ strong !{ws.language}
+ if(ws.language_additional_info)
+ p !{ws.language_additional_info}
+ .block
+ .row-info
+ .info-icon
+ include ../source/assets/ico/ico-teacher.svg
+ .info__location
+ span !{ws.teacher_title}
+ each teacher in ws.teachers
+ p
+ strong !{teacher.teacher_name}
+ br
+ span !{teacher.teacher_role}
+ if(teacher.teacher_org)
+ span.teacher-org !{teacher.teacher_org}
+ if(theme.workshop_submenu)
+ .inner.is-centered
+ a(role="button" href=url_for("workshop") aria-label=site.data.workshop.summary_page_aria_label).button.is-medium.is-rounded.is-primary !{site.data.workshop.summary_page_button_label}
+
+ include components/newsletter/newsletter
\ No newline at end of file
diff --git a/themes/grusp_conf/scripts/slugify.js b/themes/grusp_conf/scripts/slugify.js
new file mode 100644
index 0000000..3dd650a
--- /dev/null
+++ b/themes/grusp_conf/scripts/slugify.js
@@ -0,0 +1,7 @@
+hexo.extend.helper.register('slugify', function(input) {
+ var slugify = require('slugify');
+
+ return slugify(input, {
+ lower: true
+ });
+});
diff --git a/themes/grusp_conf/source/assets/css/_mixins.sass b/themes/grusp_conf/source/assets/css/_mixins.sass
new file mode 100644
index 0000000..7674439
--- /dev/null
+++ b/themes/grusp_conf/source/assets/css/_mixins.sass
@@ -0,0 +1,12 @@
+//- Additional mixins
+=small-phone
+ @media screen and (orientation: portrait) and (max-width: 360px)
+ @content
+
+=medium-phone
+ @media screen and (orientation: portrait) and (max-width: 600px)
+ @content
+
+=tablet-vertical
+ @media screen and (orientation: portrait) and (min-width: 768px)
+ @content
diff --git a/themes/grusp_conf/source/assets/css/breadcrumbs.sass b/themes/grusp_conf/source/assets/css/breadcrumbs.sass
new file mode 100644
index 0000000..c4b6242
--- /dev/null
+++ b/themes/grusp_conf/source/assets/css/breadcrumbs.sass
@@ -0,0 +1,25 @@
+@import "defaults"
+@import "bulma/sass/utilities/initial-variables"
+@import "bulma/sass/utilities/derived-variables"
+@import "bulma/sass/utilities/mixins"
+@import "bulma/sass/components/breadcrumb"
+
+.container_breadcrumbs
+ padding: 0
+ background-color: $main-text-color
+ .inner
+ margin: 0 auto
+
+.breadcrumb
+ color: $main-text-color_inverted
+ padding: 1em 0 0.5em 1em
+ a
+ color: $main-text-color_inverted
+ font-weight: 600
+ &:hover, &:active, &:focus
+ color: $main-text-color_inverted
+ li.is-active a
+ color: $main-text-color_inverted
+ font-weight: 200
+ ul
+ text-transform: lowercase
\ No newline at end of file
diff --git a/themes/grusp_conf/source/assets/css/defaults.sass b/themes/grusp_conf/source/assets/css/defaults.sass
new file mode 100644
index 0000000..52a7ca0
--- /dev/null
+++ b/themes/grusp_conf/source/assets/css/defaults.sass
@@ -0,0 +1,15 @@
+//- Colori principali
+$main-color: #1B365D
+$main-color_hue-medium: #2f4666
+$main-color_hue-light: #6492d5
+
+$main-text-color: #000
+$main-text-color_hue-medium: rgba(0, 0, 0, .4)
+$main-text-color_hue-medium_low: rgba(0, 0, 0, .3)
+$main-text-color_hue-light: rgba(0, 0, 0, .2)
+$main-text-color_hue-lighter: rgba(0, 0, 0, .1)
+$main-text-color_inverted: #fff
+
+//- Font
+
+$body-family: 'Montserrat', sans-serif, -apple-system
diff --git a/themes/grusp_conf/source/assets/css/fonts.sass b/themes/grusp_conf/source/assets/css/fonts.sass
new file mode 100644
index 0000000..d9cdf23
--- /dev/null
+++ b/themes/grusp_conf/source/assets/css/fonts.sass
@@ -0,0 +1,71 @@
+@font-face
+ font-family: 'Montserrat'
+ src: url('../fonts/Montserrat-Bold.eot')
+ src: local('Montserrat Bold'), local('Montserrat-Bold'),
+ url('../fonts/Montserrat-Bold.eot?#iefix') format('embedded-opentype'),
+ url('../fonts/Montserrat-Bold.woff2') format('woff2'),
+ url('../fonts/Montserrat-Bold.woff') format('woff'),
+ url('../fonts/Montserrat-Bold.ttf') format('truetype'),
+ url('../fonts/Montserrat-Bold.svg#Montserrat-Bold') format('svg')
+ font-weight: bold
+ font-style: normal
+
+@font-face
+ font-family: 'Montserrat'
+ src: url('../fonts/Montserrat-Black.eot')
+ src: local('Montserrat Black'), local('Montserrat-Black'),
+ url('../fonts/Montserrat-Black.eot?#iefix') format('embedded-opentype'),
+ url('../fonts/Montserrat-Black.woff2') format('woff2'),
+ url('../fonts/Montserrat-Black.woff') format('woff'),
+ url('../fonts/Montserrat-Black.ttf') format('truetype'),
+ url('../fonts/Montserrat-Black.svg#Montserrat-Black') format('svg')
+ font-weight: 900
+ font-style: normal
+
+@font-face
+ font-family: 'Montserrat'
+ src: url('../fonts/Montserrat-BlackItalic.eot')
+ src: local('Montserrat Black Italic'), local('Montserrat-BlackItalic'),
+ url('../fonts/Montserrat-BlackItalic.eot?#iefix') format('embedded-opentype'),
+ url('../fonts/Montserrat-BlackItalic.woff2') format('woff2'),
+ url('../fonts/Montserrat-BlackItalic.woff') format('woff'),
+ url('../fonts/Montserrat-BlackItalic.ttf') format('truetype'),
+ url('../fonts/Montserrat-BlackItalic.svg#Montserrat-BlackItalic') format('svg')
+ font-weight: 900
+ font-style: italic
+
+@font-face
+ font-family: 'Montserrat'
+ src: url('../fonts/Montserrat-Regular.eot')
+ src: local('Montserrat Regular'), local('Montserrat-Regular'),
+ url('../fonts/Montserrat-Regular.eot?#iefix') format('embedded-opentype'),
+ url('../fonts/Montserrat-Regular.woff2') format('woff2'),
+ url('../fonts/Montserrat-Regular.woff') format('woff'),
+ url('../fonts/Montserrat-Regular.ttf') format('truetype'),
+ url('../fonts/Montserrat-Regular.svg#Montserrat-Regular') format('svg')
+ font-weight: normal
+ font-style: normal
+
+@font-face
+ font-family: 'Montserrat'
+ src: url('../fonts/Montserrat-BoldItalic.eot')
+ src: local('Montserrat Bold Italic'), local('Montserrat-BoldItalic'),
+ url('../fonts/Montserrat-BoldItalic.eot?#iefix') format('embedded-opentype'),
+ url('../fonts/Montserrat-BoldItalic.woff2') format('woff2'),
+ url('../fonts/Montserrat-BoldItalic.woff') format('woff'),
+ url('../fonts/Montserrat-BoldItalic.ttf') format('truetype'),
+ url('../fonts/Montserrat-BoldItalic.svg#Montserrat-BoldItalic') format('svg')
+ font-weight: bold
+ font-style: italic
+
+@font-face
+ font-family: 'Montserrat'
+ src: url('../fonts/Montserrat-Italic.eot')
+ src: local('Montserrat Italic'), local('Montserrat-Italic'),
+ url('../fonts/Montserrat-Italic.eot?#iefix') format('embedded-opentype'),
+ url('../fonts/Montserrat-Italic.woff2') format('woff2'),
+ url('../fonts/Montserrat-Italic.woff') format('woff'),
+ url('../fonts/Montserrat-Italic.ttf') format('truetype'),
+ url('../fonts/Montserrat-Italic.svg#Montserrat-Italic') format('svg')
+ font-weight: normal
+ font-style: italic
diff --git a/themes/grusp_conf/source/assets/css/global.sass b/themes/grusp_conf/source/assets/css/global.sass
new file mode 100644
index 0000000..02c867e
--- /dev/null
+++ b/themes/grusp_conf/source/assets/css/global.sass
@@ -0,0 +1,386 @@
+@charset "utf-8"
+
+//- Fonts
+@import "fonts"
+
+//- Defaults: colors, etc
+@import "defaults"
+@import "_mixins"
+
+//- Bulma
+@import "bulma/sass/utilities/initial-variables"
+@import "bulma/sass/utilities/functions"
+@import "bulma/sass/utilities/derived-variables"
+@import "bulma/sass/utilities/mixins"
+@import "bulma/sass/base/_all"
+@import "bulma/sass/grid/columns"
+@import "bulma/sass/components/navbar"
+
+//- Common rules
+
+html
+ box-sizing: border-box
+ scroll-behavior: smooth
+*, *:before, *:after
+ box-sizing: inherit
+
+body
+ box-sizing: content-box
+ margin: 0
+ padding: 0
+ font-size: 16px
+ line-height: 1.5
+ --lh: 24px
+ width: 100vw
+ color: $main-text-color
+
+section
+ width: 100%
+ margin: 0
+ padding: 0
+ padding-top: 64px
+ +desktop
+ padding-top: 80px
+ &.section_nopadding
+ padding-top: 0
+
+h1
+ font-size: 3em
+ font-weight: 700
+ text-transform: none
+ color: $main-color
+
+h2
+ font-size: 2.4em
+ font-weight: 700
+ font-style: italic
+
+h3
+ font-size: 2em
+ font-weight: 700
+
+h4
+ font-size: 1.5em
+ font-style: italic
+ text-transform: uppercase
+
+h5
+ font-size: 1.2em
+ text-transform: uppercase
+
+p
+ margin: 1em 0
+
+a
+ color: $main-color
+ font-weight: 600
+a:hover, a:active, a:focus
+ color: $main-color
+ text-decoration: underline
+
+a.button:hover, a.button:active, a.button:focus
+ text-decoration: none
+
+//- Common classes
+
+.container
+ padding: 1em 0
+
+.inner
+ width: 90%
+ max-width: 1200px
+ margin: 2em auto
+
+.is-centered
+ text-align: center
+
+
+//- Overrides
+
+.button.is-primary
+ background-color: $main-color !important
+ border-color: $main-color !important
+ font-weight: 700
+ padding-left: 1em
+ padding-right: 1em
+ text-transform: uppercase
+ +tablet
+ padding-left: 2em
+ padding-right: 2em
+ &:hover, &:active, &:focus
+ color: $main-color !important
+ background-color: $main-text-color_inverted !important
+ border-color: $main-text-color_inverted !important
+ //- "buy tickets" button in main menu
+ &.in-menu
+ color: $main-text-color_inverted !important
+ background-color: $main-color
+ border-color: $main-text-color_inverted !important
+ font-size: 1em
+ margin: 0 1em
+ padding-left: .75rem
+ padding-right: .75rem
+ text-transform: lowercase
+ +desktop
+ color: $main-color
+ background-color: $main-text-color_inverted
+ border-width: 1px
+ margin-left: 3em
+ padding-left: 1em
+ padding-right: 1em
+ text-transform: uppercase
+ &:hover, &:active, &:focus
+ color: $main-color !important
+ background-color: $main-text-color_inverted !important
+ border-color: $main-text-color_inverted !important
+
+//- Header
+
+header
+ position: fixed
+ width: 100%
+ z-index: 999
+ transition: background-color .5s ease-in
+ background-color: $main-color
+ padding: 0
+ +desktop
+ padding: 1em 0 0
+ &.is-transparent
+ background-color: transparent
+
+.header-logo
+ width: 160px
+ height: auto
+ margin-top: -.75em
+ +tablet
+ width: 200px
+
+.header-logo svg
+ width: 200px
+ height: 60px
+ max-width: 160px
+ +desktop
+ max-width: 200px
+
+.header-logo svg path
+ fill: $main-text-color_inverted
+
+.nav-container
+ width: 100%
+ max-width: 1280px
+ margin: 0 auto
+
+.navbar
+ display: flex
+ align-items: flex-start
+ justify-content: space-between
+ background-color: transparent
+ .navbar-menu
+ background-color: transparent
+ box-shadow: none
+ transition: display .5s ease-in
+ &.is-active
+ background-color: $main-color
+ .navbar-end
+ width: 100vw
+ position: fixed
+ top: 0
+ right: 0
+ left: 0
+ background-color: $main-color
+ .navbar-link
+ color: $main-text-color_inverted
+ font-weight: 600
+ &:not(.is-arrowless)::after
+ content: "+"
+ transform: none
+ top: 40%
+ color: transparent
+ +desktop
+ color: $main-text-color_inverted
+ &:hover, &:active, &:focus
+ color: $main-text-color_inverted
+ background-color: transparent
+ text-decoration: underline
+ .navbar-item
+ color: $main-text-color_inverted
+ margin: 0 1em
+ font-weight: 600
+ &:hover, &:active, &:focus
+ color: $main-text-color_inverted
+ background-color: transparent
+ &:hover > a, &:active > a, &:focus > a
+ text-decoration: underline
+ &.has-dropdown:focus .navbar-link, &.has-dropdown:hover .navbar-link, &.has-dropdown.is-active .navbar-link
+ background-color: transparent
+ a
+ background-color: transparent
+ &:hover, &:active, &:focus
+ background-color: transparent
+ color: $main-text-color_inverted
+
+.navbar-dropdown
+ background-color: $main-color
+ border: none
+ border-bottom-left-radius: 0
+ border-bottom-right-radius: 0
+ box-shadow: none
+ font-size: 1em
+
+.navbar-burger
+ color: $main-text-color_inverted
+ position: absolute
+ right: 0
+ z-index: 100
+ &:hover, &:active, &:focus
+ color: $main-text-color_inverted
+ text-decoration: none
+
+//- Home page
+//- Hero section
+@import "../../../layout/components/hero/hero"
+//- Updates section
+@import "../../../layout/components/update/update"
+//- Call for papers section
+@import "../../../layout/components/cfp/cfp"
+//- General information section
+@import "../../../layout/components/generalinfo/generalinfo"
+//- Speakers section
+@import "../../../layout/components/speakers/speakers"
+//- Topics section
+@import "../../../layout/components/topics/topics"
+//- Workshop section
+@import "../../../layout/components/workshop/workshop"
+//- Media section
+@import "../../../layout/components/media/media"
+//- Location section
+@import "../../../layout/components/location/location"
+//- Sponsors section
+@import "../../../layout/components/sponsors/sponsors"
+//- Community partners section
+@import "../../../layout/components/community_partners/community_partners"
+//- Newsletter section
+@import "../../../layout/components/newsletter/newsletter"
+
+//- Page: Sponsor
+@import "./page_sponsor"
+//- Page: Welcome
+@import "./page_welcome"
+//- Page: Welcome / About
+@import "./page_about"
+//- Page: Welcome / COC
+@import "./page_coc"
+//- Page: Welcome / Scholarships
+@import "./page_scholarships"
+//- Page: Welcome / Where
+@import "./page_where"
+//- Page: CFP
+@import "./page_cfp"
+//- Page: Speakers & talks
+@import "./page_talks_speakers"
+//- Page: Schedule
+@import "./page_schedule"
+//- Page: Workshops
+@import "./page_workshops"
+//- Page: Workshop (single)
+@import "./page_workshop_single"
+
+//- Breadcrumbs
+@import "./breadcrumbs"
+
+//- 404 page
+
+.text_giant
+ font-weight: 600
+ font-size: 15em
+ color: $main-color
+ margin: 0 auto
+ text-align: center
+
+.container_404 .button.is-primary:hover, .container_404 .button.is-primary:active, .container_404 .button.is-primary:focus
+ border-color: $main-color !important
+
+//- Footer
+
+footer
+ background-color: #4e4d4d
+ .columns.inner
+ margin: 0 auto
+ *
+ color: $main-text-color_inverted
+ .footer__p_padded, .footer__a_padded
+ padding: 1em 0
+ a
+ font-weight: 600
+ a.past-edition
+ display: inline-block
+ margin-right: 8px
+ &:after
+ content: "|"
+ display: inline
+ padding-left: 8px
+ a.past-edition:last-of-type:after
+ content: ""
+ .row__social
+ font-size: .9em
+ font-weight: 700
+ padding: 2em 0
+ p
+ margin-bottom: 8px
+ .social-icon
+ background-color: $main-text-color_inverted
+ border: 1px solid $main-text-color_inverted
+ &:hover, &:active, &:focus
+ background-color: $main-color
+ svg
+ path, rect, ellipse, circle
+ fill: $main-text-color_inverted
+ svg
+ path, rect, ellipse, circle
+ fill: $main-color
+ nav
+ padding: 1em
+ margin-top: .5em
+ text-align: left
+ ul
+ li
+ display: block
+ padding: .5em 0
+ a
+ text-transform: uppercase
+ .footer__logo, .footer__logo svg
+ max-width: 300px
+ +desktop
+ max-width: 400px
+
+footer .inner.is-centered .column
+ font-size: .9em
+
+// scroll to top button
+.back-to-top
+ width: 60px
+ height: 50px
+ background-color: $main-color
+ position: fixed
+ bottom: 20px
+ right: 0
+ transition: all .5s ease-in
+ border-top-left-radius: 30px
+ border-bottom-left-radius: 30px
+
+// not indented to make it general (used in speakers page)
+.chevron
+ color: $main-text-color_inverted
+ transition: all .5s ease-in
+ &::before
+ border-style: solid
+ border-width: 4px 4px 0 0
+ content: ''
+ display: inline-block
+ height: 16px
+ right: 18px
+ position: absolute
+ top: 20px
+ transform: rotate(-45deg)
+ vertical-align: top
+ width: 16px
diff --git a/themes/grusp_conf/source/assets/css/page_about.sass b/themes/grusp_conf/source/assets/css/page_about.sass
new file mode 100644
index 0000000..aeb8e2d
--- /dev/null
+++ b/themes/grusp_conf/source/assets/css/page_about.sass
@@ -0,0 +1,88 @@
+@import "defaults"
+@import "bulma/sass/utilities/initial-variables"
+@import "bulma/sass/utilities/derived-variables"
+@import "bulma/sass/utilities/mixins"
+
+.title-container
+ display: flex
+ align-items: center
+ svg
+ background-color: $main-color
+ fill: $main-text-color_inverted
+ margin-right: 1em
+ h1
+ font-size: 2em
+ line-height: 1.2
+ +tablet
+ font-size: 3em
+ line-height: 1.5
+
+.container__more
+ background-color: $main-color_hue-medium
+ h2
+ font-style: normal
+ text-align: center
+ color: $main-text-color_inverted
+ font-size: 1.8em
+ line-height: 1.2
+ +tablet
+ font-size: 2em
+ line-height: 1.5
+
+.container__past-editions
+ background-color: $main-text-color
+ color: $main-text-color_inverted
+ text-align: center
+ padding: 4em 0
+ .inner
+ margin: 0 auto
+ border-top: 1px solid $main-text-color_hue-medium
+ *
+ .footer__p_padded, .footer__a_padded
+ padding: 1em 0
+ a
+ font-weight: 300
+ font-size: 1.5em
+ color: $main-color_hue-light
+ a.past-edition
+ display: inline-block
+ margin-right: 8px
+ &:after
+ content: "|"
+ display: inline
+ padding-left: 8px
+ a.past-edition:last-of-type:after
+ content: ""
+ .row__social p
+ font-weight: 600
+ h3
+ margin: 1em auto
+ .iframe-container
+ max-width: 800px
+ margin: 0 auto
+ .iframe-holder
+ overflow: hidden
+ height: 0
+ padding: 56.25% 0 0 0
+ position: relative
+ iframe
+ position: absolute
+ top: 0
+ left: 0
+ width: 100%
+ height: 100%
+
+.container__team
+ padding: 2em 0
+ h3
+ text-align: center
+ color: $main-color
+ .card
+ max-width: 200px
+ text-align: center
+ margin: 0 auto
+ .title
+ font-weight: 600
+ margin: 1em auto 0
+ .subtitle
+ margin: 0 auto
\ No newline at end of file
diff --git a/themes/grusp_conf/source/assets/css/page_cfp.sass b/themes/grusp_conf/source/assets/css/page_cfp.sass
new file mode 100644
index 0000000..e7c4340
--- /dev/null
+++ b/themes/grusp_conf/source/assets/css/page_cfp.sass
@@ -0,0 +1,41 @@
+@import "defaults"
+@import "bulma/sass/utilities/initial-variables"
+@import "bulma/sass/utilities/derived-variables"
+@import "bulma/sass/utilities/mixins"
+
+.title-container
+ display: flex
+ align-items: center
+ svg
+ background-color: $main-color
+ fill: $main-text-color_inverted
+ margin-right: 1em
+ h1
+ font-size: 2em
+ line-height: 1.2
+ +tablet
+ font-size: 3em
+ line-height: 1.5
+
+.container__more
+ padding: 2em 0
+ background-color: $main-color_hue-medium
+ h3
+ font-style: normal
+ text-align: center
+ color: $main-text-color_inverted
+ font-size: 1.8em
+ line-height: 1.2
+ +tablet
+ font-size: 2em
+ line-height: 1.5
+
+.container__contact
+ padding: 2em 0
+ h3
+ text-align: center
+ .is-centered
+ padding: 2em 0
+
+.button.is-primary:hover, .button.is-primary:active, .button.is-primary:focus
+ border-color: #5e4e9b !important
\ No newline at end of file
diff --git a/themes/grusp_conf/source/assets/css/page_coc.sass b/themes/grusp_conf/source/assets/css/page_coc.sass
new file mode 100644
index 0000000..063197b
--- /dev/null
+++ b/themes/grusp_conf/source/assets/css/page_coc.sass
@@ -0,0 +1,47 @@
+@import "defaults"
+@import "bulma/sass/utilities/initial-variables"
+@import "bulma/sass/utilities/derived-variables"
+@import "bulma/sass/utilities/mixins"
+
+.title-container
+ display: flex
+ align-items: center
+ svg
+ background-color: $main-color
+ fill: $main-text-color_inverted
+ margin-right: 1em
+ h1
+ font-size: 2em
+ line-height: 1.2
+ +tablet
+ font-size: 3em
+ line-height: 1.5
+
+.container__short-version
+ background-color: $main-color_hue-medium
+ h2
+ font-style: normal
+ text-align: center
+ color: $main-text-color_inverted
+ font-size: 1.8em
+ line-height: 1.2
+ +tablet
+ font-size: 2em
+ line-height: 1.5
+
+.container__long-version
+ background-color: $main-text-color_inverted
+ h2
+ font-style: normal
+ text-align: center
+ color: $main-color
+ font-size: 1.8em
+ line-height: 1.2
+ +tablet
+ font-size: 2em
+ line-height: 1.5
+
+.info-box
+ border: 8px solid $main-color_hue-medium
+ padding: 2em
+ margin-top: 3em
\ No newline at end of file
diff --git a/themes/grusp_conf/source/assets/css/page_schedule.sass b/themes/grusp_conf/source/assets/css/page_schedule.sass
new file mode 100644
index 0000000..c6c8c45
--- /dev/null
+++ b/themes/grusp_conf/source/assets/css/page_schedule.sass
@@ -0,0 +1,99 @@
+@import "defaults"
+@import "bulma/sass/utilities/_all"
+@import "bulma/sass/utilities/mixins"
+@import "bulma/sass/base/helpers"
+@import "bulma/sass/elements/table"
+
+.title-container_schedule
+ text-align: center
+ h1
+ text-transform: capitalize
+ &.has-text-left
+ margin-bottom: 1em
+ &.is-centered
+ margin: 0 auto
+
+.date-menu
+ padding: 0
+ text-align: center
+ a
+ margin: 0 1em
+ +tablet
+ margin: 0 2em
+ &:hover, &:active, &:focus
+ border-color: $main-color !important
+
+.timeline
+ margin-bottom: 3em
+ border: 1px solid $main-color
+ &:last-of-type
+ padding-bottom: 0
+ .info-bar
+ background-color: $main-color
+ padding: 1em
+ .row-info
+ display: flex
+ align-items: center
+ .info__date
+ color: $main-text-color_inverted
+ text-transform: uppercase
+ //- this is to avoid hiding the title under the top header on scroll
+ padding-top: 8em
+ margin-top: -8em
+ svg path
+ fill: $main-text-color_inverted
+ .talk-anchor-pre
+ padding-top: 10em
+ margin-top: -10em
+ table
+ color: $main-text-color
+ tr
+ td
+ padding: .5em 1em
+ border-left: 1px solid $main-color
+ &.has-background
+ background-color: $main-text-color_hue-lighter
+ &::before
+ content: "\2022"
+ color: $main-color
+ font-weight: 600
+ font-size: 2em
+ display: inline-block
+ width: 1em
+ margin-left: -.7em
+ &.empty-item::before
+ content: ""
+ &.has-service-icon
+ padding-bottom: 1em
+ time
+ font-weight: 600
+ color: $main-color
+ margin-left: -.7em
+ span
+ font-weight: 200
+ font-style: italic
+ color: $main-text-color
+ &::after
+ content: ", "
+ &:last-of-type::after
+ content: ""
+ &.talk-anchor-pre
+ &::after
+ content: ""
+ .track-title
+ font-weight: 600
+ font-style: normal
+ color: $main-color
+ &::after
+ content: ""
+ svg
+ margin-top: -3em
+ margin-bottom: -2em
+ path
+ fill: $main-color
+ img
+ display: inline
+ margin-top: -50px
+ margin-bottom: 5px
+ max-width: 60px
+ margin-left: 180px
diff --git a/themes/grusp_conf/source/assets/css/page_scholarships.sass b/themes/grusp_conf/source/assets/css/page_scholarships.sass
new file mode 100644
index 0000000..fb381f1
--- /dev/null
+++ b/themes/grusp_conf/source/assets/css/page_scholarships.sass
@@ -0,0 +1,56 @@
+@import "defaults"
+@import "bulma/sass/utilities/initial-variables"
+@import "bulma/sass/utilities/derived-variables"
+@import "bulma/sass/utilities/mixins"
+
+#scholarships
+ h4
+ border-bottom: 1px solid
+ p
+ &.text_bigger
+ font-size: 1.2em
+ font-weight: 600
+ a
+ font-weight: 600
+
+.title-container
+ display: flex
+ align-items: center
+ svg
+ background-color: $main-color
+ fill: $main-text-color_inverted
+ margin-right: 1em
+ h1
+ font-size: 2em
+ line-height: 1.2
+ +tablet
+ font-size: 3em
+ line-height: 1.5
+
+.container__short-version
+ background-color: $main-color_hue-medium
+ h2
+ font-style: normal
+ text-align: center
+ color: $main-text-color_inverted
+ font-size: 1.8em
+ line-height: 1.2
+ +tablet
+ font-size: 2em
+ line-height: 1.5
+ a
+ color: $main-text-color_inverted
+
+.container__long-version
+ background-color: $main-text-color_inverted
+ h3
+ color: $main-color
+ font-size: 1.8em
+ line-height: 1.2
+ +tablet
+ font-size: 2em
+ line-height: 1.5
+
+.container_diversity-partners
+ img
+ max-width: 300px
diff --git a/themes/grusp_conf/source/assets/css/page_sponsor.sass b/themes/grusp_conf/source/assets/css/page_sponsor.sass
new file mode 100644
index 0000000..4a75c98
--- /dev/null
+++ b/themes/grusp_conf/source/assets/css/page_sponsor.sass
@@ -0,0 +1,125 @@
+@import "defaults"
+@import "bulma/sass/utilities/initial-variables"
+@import "bulma/sass/utilities/derived-variables"
+@import "bulma/sass/utilities/mixins"
+@import "_mixins"
+
+#partners_page
+ h1
+ text-transform: none
+ color: $main-color
+ font-size: 2em
+ line-height: 1.2
+ +tablet
+ font-size: 3em
+ line-height: 1.5
+ h2
+ font-style: normal
+ text-align: center
+ color: $main-text-color_inverted
+ font-size: 1.8em
+ line-height: 1.2
+ +tablet
+ font-size: 2em
+ line-height: 1.5
+ +desktop
+ font-size: 2.5em
+ h3
+ font-size: 1.5em
+ +tablet
+ font-size: 1.8em
+ p
+ margin: 1em 0
+ .column
+ margin: 0 2em
+ .is-centered p
+ margin: 0 0 1em 0
+
+.background-light
+ background-color: $main-color_hue-medium
+ a
+ color: $main-text-color
+ font-weight: 600
+
+.options-container
+ display: flex
+ flex-wrap: wrap
+ justify-content: space-evenly
+ align-items: flex-start
+ .level-block
+ margin: 20px
+ border: 1px solid $main-text-color
+ display: flex
+ flex-direction: column
+ justify-items: flex-start
+ flex-shrink: 1
+ width: 320px
+ +small-phone
+ width: 300px
+ & > div:not(.triangle)
+ padding: 20px
+ h3
+ font-size: 1.8em
+ p, li
+ margin: 0 !important
+ font-size: .8em
+ ul
+ list-style: disc outside
+ margin-left: 10px
+ .level-block__intro
+ background-color: $main-text-color
+ color: $main-text-color_inverted
+ text-align: center
+ .triangle
+ width: 0
+ height: 0
+ border-style: solid
+ border-width: 40px 160px 0 160px
+ border-top-color: $main-text-color
+ border-right-color: $main-color
+ border-bottom-color: $main-color
+ border-left-color: $main-color
+ margin: 0 auto
+ padding: 0
+ +small-phone
+ border-width: 40px 150px 0 150px
+ &.triangle_description_2
+ border-right-color: $main-color_hue-light
+ border-bottom-color: $main-color_hue-light
+ border-left-color: $main-color_hue-light
+ &.triangle_description_3
+ border-right-color: $main-text-color_hue-medium
+ border-bottom-color: $main-text-color_hue-medium
+ border-left-color: $main-text-color_hue-medium
+ &.triangle_description_4
+ border-right-color: $main-text-color_hue-medium_low
+ border-bottom-color: $main-text-color_hue-medium_low
+ border-left-color: $main-text-color_hue-medium_low
+ &.triangle_description_5
+ border-right-color: $main-text-color_hue-light
+ border-bottom-color: $main-text-color_hue-light
+ border-left-color: $main-text-color_hue-light
+ &.triangle_description_6
+ border-right-color: $main-text-color_hue-lighter
+ border-bottom-color: $main-text-color_hue-lighter
+ border-left-color: $main-text-color_hue-lighter
+ &.triangle_description_7
+ border-right-color: $main-text-color_inverted
+ border-bottom-color: $main-text-color_inverted
+ border-left-color: $main-text-color_inverted
+ .level-block__description_1
+ background-color: $main-color
+ color: $main-text-color_inverted
+ .level-block__description_2
+ background-color: $main-color_hue-light
+ .level-block__description_3
+ background-color: $main-text-color_hue-medium
+ .level-block__description_4
+ background-color: $main-text-color_hue-medium_low
+ .level-block__description_5
+ background-color: $main-text-color_hue-light
+ .level-block__description_6
+ background-color: $main-text-color_hue-lighter
+ .level-block__description_7
+ background-color: $main-text-color_inverted
+
\ No newline at end of file
diff --git a/themes/grusp_conf/source/assets/css/page_talks_speakers.sass b/themes/grusp_conf/source/assets/css/page_talks_speakers.sass
new file mode 100644
index 0000000..a536c02
--- /dev/null
+++ b/themes/grusp_conf/source/assets/css/page_talks_speakers.sass
@@ -0,0 +1,211 @@
+@import "defaults"
+@import "bulma/sass/utilities/initial-variables"
+@import "bulma/sass/utilities/derived-variables"
+@import "bulma/sass/utilities/mixins"
+
+#speakers
+ .title-container
+ .columns
+ width: 100%
+ .row-info
+ display: flex
+ flex-direction: row
+ align-items: center
+ justify-content: flex-end
+ text-transform: uppercase
+ color: $main-text-color
+ font-size: .7em
+ +tablet
+ font-size: 1em
+ .info-icon
+ margin-top: 6px
+ svg
+ background-color: $main-text-color_inverted
+ path
+ fill: $main-color
+ .info-icon.padded
+ padding: 0 0 0 10px
+ +tablet
+ padding: 0 0 0 30px
+ h1
+ color: $main-color
+ &.is-centered
+ margin: 0 auto
+ h2
+ font-style: normal
+ text-align: left
+ font-size: 1.8em
+ line-height: 1.2
+ color: $main-color
+ //- this is to avoid hiding the title under the top header on scroll
+ padding-top: 5em
+ margin-top: -5em
+ +tablet
+ font-size: 2em
+ line-height: 1.5
+ &.talk-title
+ text-align: left
+ font-size: 1.4em
+ line-height: 1.2
+ color: $main-color
+ strong::after
+ content: ' '
+ h3
+ font-size: 1.5em
+ color: $main-color
+ //- this is to avoid hiding the title under the top header on scroll
+ padding-top: 5em
+ margin-top: -5em
+ +tablet
+ font-size: 1.8em
+ &.speaker-name
+ p
+ margin: .5em 0
+ .video-container
+ margin: 2em auto 0
+ text-align: center
+ .date-menu
+ padding: 0
+ text-align: center
+ .inner
+ margin: 2em auto 1em
+ a
+ margin: 0 1em
+ +tablet
+ margin: 0 2em
+ &:hover, &:active, &:focus
+ border: 1px solid $main-color
+
+.date-holder
+ background-color: $main-color
+ color: $main-text-color_inverted
+ .inner
+ padding: 0
+ margin: 0 auto
+ .row-info
+ display: flex
+ flex-direction: row
+ align-items: center
+ justify-content: flex-start
+ text-transform: uppercase
+ color: $main-text-color_inverted
+ font-size: .7em
+ +tablet
+ font-size: 1em
+ .info-icon
+ margin-top: 6px
+ svg
+ path
+ fill: $main-text-color_inverted
+ .info-icon.padded
+ padding: 0 0 0 10px
+ +tablet
+ padding: 0 0 0 30px
+
+.has-dynamic-background
+ .row-info
+ display: flex
+ flex-direction: row
+ align-items: center
+ justify-content: flex-start
+ .info-icon
+ margin-top: 6px
+ svg
+ path
+ fill: $main-text-color
+ .info-icon.padded
+ padding: 0 0 0 10px
+ +tablet
+ padding: 0 0 0 30px
+
+.has-dynamic-background:nth-of-type(even)
+ background-color: $main-text-color_hue-lighter
+
+.block-speaker
+ padding: 1em 0
+ margin: 1em
+ +tablet
+ margin: 1em 3em
+ +desktop
+ margin: 1em 5em
+ .columns
+ margin: 0
+ .column
+ padding: 0
+ .column_speaker
+ flex-basis: auto
+ flex-grow: 0
+ .speaker-card
+ max-width: 200px
+ padding: 0
+ margin-right: 2em
+ .speaker-info
+ display: flex
+ justify-content: flex-start
+ align-items: baseline
+ .column
+ display: flex
+ flex-basis: auto
+ .column:first-of-type
+ flex-grow: 0
+ .column:last-of-type
+ flex-grow: 1
+ margin: 0 1em
+ p
+ font-size: 1.2em
+ font-weight: 600
+ .speaker-bio
+ strong::after
+ content: ' '
+ .columns_talk-title
+ display: block
+ .has-border
+ border: 8px solid $main-color_hue-medium
+ background-color: $main-text-color_inverted
+ padding: 1em
+ margin-top: 2em
+ text-align: left
+ span.speaker-name
+ color: $main-color
+ &:after
+ content: " "
+
+a.secondary-menu-button
+ width: 60px
+ height: 50px
+ margin-left: -80px
+ margin-top: -16px
+ right: 0
+ background-color: $main-color
+ border-top-left-radius: 30px
+ border-bottom-left-radius: 30px
+ color: $main-text-color_inverted
+ font-size: 2em
+ font-weight: 600
+ padding-left: 20px
+ transition: all .5s ease-in
+ &:hover, &:active, &:focus
+ color: $main-text-color_inverted
+ text-decoration: none
+ .chevron
+ position: relative
+ &::before
+ transform: rotate(-135deg)
+ right: 30px
+ top: 16px
+
+aside.menu.secondary-menu
+ width: 12em
+ padding: 1em
+ position: fixed
+ right: -14em
+ top: 6em
+ background-color: $main-color
+ transition: all .5s
+ display: inline-flex
+ .secondary-menu-button-container
+ display: inline-flex
+ a
+ color: $main-text-color_inverted
+ &:target
+ right: 0
diff --git a/themes/grusp_conf/source/assets/css/page_welcome.sass b/themes/grusp_conf/source/assets/css/page_welcome.sass
new file mode 100644
index 0000000..c379889
--- /dev/null
+++ b/themes/grusp_conf/source/assets/css/page_welcome.sass
@@ -0,0 +1,89 @@
+@import "defaults"
+@import "bulma/sass/utilities/initial-variables"
+@import "bulma/sass/utilities/derived-variables"
+@import "bulma/sass/utilities/mixins"
+
+.title-container
+ display: flex
+ align-items: center
+ svg
+ background-color: $main-color
+ fill: $main-text-color_inverted
+ margin-right: 1em
+ h1
+ font-size: 2em
+ line-height: 1.2
+ +tablet
+ font-size: 3em
+ line-height: 1.5
+
+#welcome .columns.inner
+ margin: 0 auto
+ border-top: 1px solid $main-text-color_hue-medium
+ *
+ .footer__p_padded, .footer__a_padded
+ padding: 1em 0
+ a
+ font-weight: 600
+ a.past-edition
+ display: inline-block
+ margin-right: 8px
+ &:after
+ content: "|"
+ display: inline
+ padding-left: 8px
+ a.past-edition:last-of-type:after
+ content: ""
+ .row__social p
+ font-weight: 600
+
+.welcome__container_moreinfo
+ background-color: $main-text-color
+ color: $main-text-color_inverted
+ padding: 2em 0 0
+ .is-centered
+ padding-top: 2em
+ .summary-blocks
+ display: flex
+ flex: 1
+ flex-wrap: wrap
+ justify-content: space-between
+ .block
+ display: flex
+ flex-direction: column
+ flex-grow: 1
+ padding: 2em
+ min-width: 90%
+ max-width: 90%
+ +tablet
+ min-width: 40%
+ max-width: 40%
+ +desktop
+ min-width: 25%
+ max-width: 25%
+ a
+ color: $main-color_hue-medium
+ .row-info
+ display: flex
+ flex-direction: row
+ flex-wrap: wrap
+ .info-icon svg
+ width: 3em
+ height: 3em
+ fill: $main-text-color_inverted
+ a
+ color: $main-text-color_inverted
+ font-size: .6em
+ font-weight: 300 !important
+ +widescreen
+ font-size: .7em
+ .info__location
+ font-size: 2em
+ text-transform: uppercase
+ p:last-of-type
+ margin-top: auto
+ #hero__community_partners
+ padding-top: 0
+ padding-bottom: 0
+ .community-partners-container
+ background-color: $main-text-color_inverted
\ No newline at end of file
diff --git a/themes/grusp_conf/source/assets/css/page_where.sass b/themes/grusp_conf/source/assets/css/page_where.sass
new file mode 100644
index 0000000..cb756e4
--- /dev/null
+++ b/themes/grusp_conf/source/assets/css/page_where.sass
@@ -0,0 +1,147 @@
+@import "defaults"
+@import "bulma/sass/utilities/initial-variables"
+@import "bulma/sass/utilities/derived-variables"
+@import "bulma/sass/utilities/mixins"
+@import "_mixins"
+
+.venue__header
+ width: 100vw
+ padding: 8em 0
+ background-image: url("/assets/img/venue/venue.jpg")
+ +tablet
+ background-image: url("/assets/img/venue/tablet_venue.jpg")
+ +desktop
+ background-image: url("/assets/img/venue/desktop_venue.jpg")
+ +widescreen
+ background-image: url("/assets/img/venue/widescreen_venue.jpg")
+ +fullhd
+ background-image: url("/assets/img/venue/venue.jpg")
+ +tablet-vertical
+ background-image: url("/assets/img/venue/tablet_vertical_venue.jpg")
+ +medium-phone
+ background-image: url("/assets/img/venue/mobile_medium_venue.jpg")
+ +small-phone
+ background-image: url("/assets/img/venue/mobile_small_venue.jpg")
+ h2
+ color: $main-text-color_inverted
+ font-style: normal
+ font-size: 3em
+ &.is-online-conference
+ background-image: url("/assets/img/venue/venue-online.jpg")
+ +tablet
+ background-image: url("/assets/img/venue/tablet_venue-online.jpg")
+ +desktop
+ background-image: url("/assets/img/venue/desktop_venue-online.jpg")
+ +widescreen
+ background-image: url("/assets/img/venue/widescreen_venue-online.jpg")
+ +fullhd
+ background-image: url("/assets/img/venue/venue-online.jpg")
+ +tablet-vertical
+ background-image: url("/assets/img/venue/tablet_vertical_venue-online.jpg")
+ +medium-phone
+ background-image: url("/assets/img/venue/mobile_medium_venue-online.jpg")
+ +small-phone
+ background-image: url("/assets/img/venue/mobile_small_venue-online.jpg")
+
+.title-container
+ display: flex
+ align-items: center
+ svg
+ background-color: $main-color
+ fill: $main-text-color_inverted
+ margin-right: 1em
+ h1
+ font-size: 2em
+ line-height: 1.2
+ +tablet
+ font-size: 3em
+ line-height: 1.5
+
+.venue-container__more
+ background-color: $main-color_hue-medium
+ padding: 2em 0
+ h2
+ font-size: 2.4em
+ font-style: normal
+ text-align: center
+ color: $main-text-color_inverted
+ h3
+ color: $main-text-color
+ font-style: normal
+ text-transform: none
+ font-weight: 600
+ text-align: left
+ font-size: 1.8em
+ line-height: 1.2
+ +tablet
+ font-size: 2em
+ line-height: 1.5
+
+.container__map
+ background-color: $main-text-color_inverted
+ color: $main-color
+ text-align: center
+ padding: 2em
+ h2
+ font-size: 2.4em
+ .inner
+ margin: 0 auto
+ *
+ .footer__p_padded, .footer__a_padded
+ padding: 1em 0
+ a
+ font-weight: 600
+ font-size: 2em
+ color: $main-text-color_inverted
+ h3
+ margin: 1em auto
+ .iframe-container
+ max-width: 800px
+ margin: 0 auto 2em
+ .iframe-holder
+ overflow: hidden
+ height: 0
+ padding: 56.25% 0 0 0
+ position: relative
+ iframe
+ position: absolute
+ top: 0
+ left: 0
+ width: 100%
+ height: 100%
+
+.container__hotels
+ background-color: $main-text-color
+ color: $main-text-color_inverted
+ padding: 2em 0
+ .row-info
+ display: flex
+ flex-direction: row
+ svg
+ width: 4em
+ height: 4em
+ path
+ fill: $main-text-color_inverted
+ .column
+ margin-top: 2em
+ h3
+ text-align: left
+ text-transform: uppercase
+ font-weight: 200
+ margin-top: .25em
+ h4
+ color: $main-color_hue-medium
+ font-style: normal
+ font-weight: 600
+ text-transform: none
+ a
+ color: $main-text-color_inverted
+
+.image-credits
+ position: relative
+ margin: -2em auto 0
+ text-align: center
+ font-size: .8em
+ color: $main-text-color_inverted
+ a
+ color: $main-text-color_inverted
\ No newline at end of file
diff --git a/themes/grusp_conf/source/assets/css/page_workshop_single.sass b/themes/grusp_conf/source/assets/css/page_workshop_single.sass
new file mode 100644
index 0000000..a90e004
--- /dev/null
+++ b/themes/grusp_conf/source/assets/css/page_workshop_single.sass
@@ -0,0 +1,175 @@
+@import "defaults"
+@import "bulma/sass/utilities/initial-variables"
+@import "bulma/sass/utilities/derived-variables"
+@import "bulma/sass/utilities/mixins"
+@import "_mixins"
+
+#workshop
+ h1
+ text-align: left
+#page-workshop
+ h1
+ font-size: 3em
+ line-height: 1.5em
+ text-align: left
+ .button:hover, .button:active, .button:focus
+ border-color: $main-color
+ span.teacher-org::before
+ content: ' @ '
+
+.workshop-single__header
+ background: url("/assets/img/workshop/worskhop_header.jpg") no-repeat top center
+ width: 100vw
+ padding: 8em 0
+ +tablet
+ background-image: url("/assets/img/workshop/tablet_worskhop_header.jpg")
+ +desktop
+ background-image: url("/assets/img/workshop/desktop_worskhop_header.jpg")
+ +widescreen
+ background-image: url("/assets/img/workshop/widescreen_worskhop_header.jpg")
+ +fullhd
+ background-image: url("/assets/img/workshop/worskhop_header.jpg")
+ +tablet-vertical
+ background-image: url("/assets/img/workshop/tablet_vertical_worskhop_header.jpg")
+ +medium-phone
+ background-image: url("/assets/img/workshop/mobile_medium_worskhop_header.jpg")
+ +small-phone
+ background-image: url("/assets/img/workshop/mobile_small_worskhop_header.jpg")
+ &.is-online-conference
+ background-image: url("/assets/img/workshop/worskhop_header-online.jpg")
+ +tablet
+ background-image: url("/assets/img/workshop/tablet_worskhop_header-online.jpg")
+ +desktop
+ background-image: url("/assets/img/workshop/desktop_worskhop_header-online.jpg")
+ +widescreen
+ background-image: url("/assets/img/workshop/widescreen_worskhop_header-online.jpg")
+ +fullhd
+ background-image: url("/assets/img/workshop/worskhop_header-online.jpg")
+ +tablet-vertical
+ background-image: url("/assets/img/workshop/tablet_vertical_worskhop_header-online.jpg")
+ +medium-phone
+ background-image: url("/assets/img/workshop/mobile_medium_worskhop_header-online.jpg")
+ +small-phone
+ background-image: url("/assets/img/workshop/mobile_small_worskhop_header-online.jpg")
+ .image-credits
+ position: relative
+ margin: -2em auto 0
+ text-align: center
+ font-size: .8em
+ color: $main-text-color_inverted
+ a
+ color: $main-text-color_inverted
+ h2
+ color: $main-text-color_inverted
+ margin: 1em 0
+ font-style: normal
+ font-size: 3em
+ .inner
+ display: flex
+ flex-direction: column
+ align-items: flex-start
+ .button.is-primary
+ background-color: $main-text-color_inverted !important
+ color: $main-color
+ border-color: $main-text-color_inverted !important
+ &:hover, &:active, &:focus
+ background-color: $main-color !important
+ color: $main-text-color_inverted !important
+ border-color: $main-color !important
+.workshop-single__container
+ h1, h2
+ color: $main-color
+ .workshop-single__intro
+ .row-info
+ display: flex
+ flex-direction: row
+ flex-wrap: wrap
+ align-items: center
+ text-transform: uppercase
+ color: $main-text-color
+ justify-content: space-around
+ font-size: 1.1em
+ font-weight: 600
+ margin: 1em 0
+ border-bottom: 1px solid $main-text-color_hue-medium
+ .column
+ display: flex
+ align-items: center
+ .info__language, .info__teacher
+ padding: 0 10px 0 10px
+ iframe
+ max-width: 100%
+ margin-top: 1em
+ .button.is-primary
+ border-color: $main-color !important
+ &:hover, &:active, &:focus
+ border-color: $main-color !important
+ .workshop-single__teacher
+ background-color: $main-text-color_hue-lighter
+ h2
+ text-align: center
+ font-style: normal
+ font-size: 3em
+ .inner
+ padding: 2em 0
+ .workshop-single__moreinfo
+ h3
+ color: $main-color
+ margin: 1em 0
+ ul
+ list-style: disc inside
+ .workshop-single__cta
+ background-color: $main-color
+ .inner
+ margin: 0 auto
+ padding: 2em 0
+ text-align: center
+ h3
+ color: $main-text-color_inverted
+ margin-bottom: 1em
+ .button.is-primary
+ background-color: $main-text-color_inverted !important
+ color: $main-color
+ border-color: $main-text-color_inverted
+ &:hover, &:active, &:focus
+ background-color: $main-color !important
+ color: $main-text-color_inverted !important
+ border-color: $main-text-color_inverted !important
+ .workshop-single__summary
+ background-color: $main-text-color
+ color: $main-text-color_inverted
+ .inner
+ margin: 0 auto
+ .summary-blocks
+ display: flex
+ flex: 1
+ flex-wrap: wrap
+ justify-content: space-between
+ .block
+ padding: 2em
+ max-width: 90%
+ +desktop
+ min-width: 40%
+ max-width: 40%
+ .row-info
+ display: flex
+ flex-direction: row
+ flex-wrap: wrap
+ font-size: .8em
+ +tablet
+ font-size: 1em
+ .info-icon
+ margin-left: -.8em
+ svg
+ fill: $main-text-color_inverted
+ width: 3em
+ height: 3em
+ .info__location
+ font-size: 2em
+ text-transform: uppercase
+ strong
+ color: $main-color_hue-medium
+ a
+ color: $main-text-color_inverted
+ .is-centered
+ padding: 2em 0
diff --git a/themes/grusp_conf/source/assets/css/page_workshops.sass b/themes/grusp_conf/source/assets/css/page_workshops.sass
new file mode 100644
index 0000000..438ecfe
--- /dev/null
+++ b/themes/grusp_conf/source/assets/css/page_workshops.sass
@@ -0,0 +1,129 @@
+@import "defaults"
+@import "bulma/sass/utilities/initial-variables"
+@import "bulma/sass/utilities/derived-variables"
+@import "bulma/sass/utilities/mixins"
+
+.workshop-component-holder
+ padding-top: 5em
+
+#workshop
+ h1
+ color: $main-color
+ h2
+ text-align: center
+ font-style: normal
+ color: $main-color
+
+.workshop__container
+ padding: 1em 0 2em
+ margin: 0
+ .inner
+ margin: 0 auto
+ max-width: 1200px
+ border-bottom: 1px solid $main-text-color_hue-medium
+ .workshop__info
+ text-align: left
+ &:last-of-type .inner
+ border-bottom: none
+ h5
+ text-transform: none
+ font-weight: 600
+ color: $main-color
+ p
+ color: $main-text-color
+ .columns
+ margin-top: 1em
+ margin-bottom: 0
+ flex-wrap: wrap
+ &.no-margin-top
+ margin-top: 0
+ &.workshop__info
+ display: flex
+ flex-direction: column
+ align-content: space-between
+ min-width: 240px
+ .workshop__info
+ max-width: 80%
+ margin: 0 auto
+ +tablet
+ min-width: 600px
+ .card-image
+ width: 190px
+ height: 190px
+ overflow: hidden
+ .workshop-buttons
+ display: flex
+ flex-wrap: wrap
+ justify-content: center
+ align-content: center
+ max-width: 80%
+ margin: 0 auto
+ +tablet
+ min-width: 450px
+ .workshop-buttons__button-container
+ min-width: 190px
+ height: 190px
+ margin: 10px
+ display: flex
+ flex-direction: column
+ align-items: center
+ align-content: center
+ justify-content: center
+ text-align: center
+ background-color: $main-color
+ border: 1px solid $main-color
+ &:hover, &:focus, &:active
+ background-color: $main-text-color_inverted
+ svg path, svg polygon
+ fill: $main-color
+ a
+ color: $main-text-color_inverted
+ text-transform: uppercase
+ font-size: .8em
+ font-weight: 600
+ &:hover > a, &:focus > a, &:active > a
+ color: $main-color
+ text-decoration: none
+ .workshop-buttons__button
+ width: 120px
+ height: 120px
+ svg path, svg polygon
+ fill: $main-text-color_inverted
+
+ .row-info
+ color: $main-text-color
+ display: flex
+ flex-direction: row
+ align-items: center
+ text-transform: uppercase
+ font-size: .7em
+ +tablet
+ font-size: .9em
+ .info__date
+ padding: 0 10px 0 10px
+ .info-icon
+ margin-top: 6px
+ .info-icon.padded
+ padding: 0 0 0 10px
+ +tablet
+ padding: 0 0 0 10px
+ svg
+ height: 30px
+ width: auto
+ .row__more
+ padding-top: 2em
+ flex-wrap: wrap
+ .button.is-primary
+ background-color: $main-color
+ font-weight: 700
+ padding-left: 1em
+ padding-right: 1em
+ margin: 10px auto
+ +tablet
+ padding-left: 2em
+ padding-right: 2em
+ margin-right: 1em
+ &:hover, &:active, &:focus
+ color: $main-color
+ border-color: $main-color
+ background-color: $main-text-color_inverted
\ No newline at end of file
diff --git a/themes/grusp_conf/source/assets/favicons/android-chrome-192x192.png b/themes/grusp_conf/source/assets/favicons/android-chrome-192x192.png
new file mode 100644
index 0000000..4942e79
Binary files /dev/null and b/themes/grusp_conf/source/assets/favicons/android-chrome-192x192.png differ
diff --git a/themes/grusp_conf/source/assets/favicons/android-chrome-512x512.png b/themes/grusp_conf/source/assets/favicons/android-chrome-512x512.png
new file mode 100644
index 0000000..d3bd6a8
Binary files /dev/null and b/themes/grusp_conf/source/assets/favicons/android-chrome-512x512.png differ
diff --git a/themes/grusp_conf/source/assets/favicons/apple-touch-icon.png b/themes/grusp_conf/source/assets/favicons/apple-touch-icon.png
new file mode 100644
index 0000000..93dfecf
Binary files /dev/null and b/themes/grusp_conf/source/assets/favicons/apple-touch-icon.png differ
diff --git a/themes/grusp_conf/source/assets/favicons/browserconfig.xml b/themes/grusp_conf/source/assets/favicons/browserconfig.xml
new file mode 100644
index 0000000..b3930d0
--- /dev/null
+++ b/themes/grusp_conf/source/assets/favicons/browserconfig.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+ #da532c
+
+
+
diff --git a/themes/grusp_conf/source/assets/favicons/favicon-16x16.png b/themes/grusp_conf/source/assets/favicons/favicon-16x16.png
new file mode 100644
index 0000000..d19d52d
Binary files /dev/null and b/themes/grusp_conf/source/assets/favicons/favicon-16x16.png differ
diff --git a/themes/grusp_conf/source/assets/favicons/favicon-32x32.png b/themes/grusp_conf/source/assets/favicons/favicon-32x32.png
new file mode 100644
index 0000000..88e9f16
Binary files /dev/null and b/themes/grusp_conf/source/assets/favicons/favicon-32x32.png differ
diff --git a/themes/grusp_conf/source/assets/favicons/favicon.ico b/themes/grusp_conf/source/assets/favicons/favicon.ico
new file mode 100644
index 0000000..47fdd02
Binary files /dev/null and b/themes/grusp_conf/source/assets/favicons/favicon.ico differ
diff --git a/themes/grusp_conf/source/assets/favicons/mstile-144x144.png b/themes/grusp_conf/source/assets/favicons/mstile-144x144.png
new file mode 100644
index 0000000..9780b59
Binary files /dev/null and b/themes/grusp_conf/source/assets/favicons/mstile-144x144.png differ
diff --git a/themes/grusp_conf/source/assets/favicons/mstile-150x150.png b/themes/grusp_conf/source/assets/favicons/mstile-150x150.png
new file mode 100644
index 0000000..c5e0579
Binary files /dev/null and b/themes/grusp_conf/source/assets/favicons/mstile-150x150.png differ
diff --git a/themes/grusp_conf/source/assets/favicons/mstile-310x150.png b/themes/grusp_conf/source/assets/favicons/mstile-310x150.png
new file mode 100644
index 0000000..c32b5cd
Binary files /dev/null and b/themes/grusp_conf/source/assets/favicons/mstile-310x150.png differ
diff --git a/themes/grusp_conf/source/assets/favicons/mstile-310x310.png b/themes/grusp_conf/source/assets/favicons/mstile-310x310.png
new file mode 100644
index 0000000..ef21b41
Binary files /dev/null and b/themes/grusp_conf/source/assets/favicons/mstile-310x310.png differ
diff --git a/themes/grusp_conf/source/assets/favicons/mstile-70x70.png b/themes/grusp_conf/source/assets/favicons/mstile-70x70.png
new file mode 100644
index 0000000..96b6b0a
Binary files /dev/null and b/themes/grusp_conf/source/assets/favicons/mstile-70x70.png differ
diff --git a/themes/grusp_conf/source/assets/favicons/safari-pinned-tab.svg b/themes/grusp_conf/source/assets/favicons/safari-pinned-tab.svg
new file mode 100644
index 0000000..eec208a
--- /dev/null
+++ b/themes/grusp_conf/source/assets/favicons/safari-pinned-tab.svg
@@ -0,0 +1,91 @@
+
+
+
diff --git a/themes/grusp_conf/source/assets/favicons/site.webmanifest b/themes/grusp_conf/source/assets/favicons/site.webmanifest
new file mode 100644
index 0000000..b20abb7
--- /dev/null
+++ b/themes/grusp_conf/source/assets/favicons/site.webmanifest
@@ -0,0 +1,19 @@
+{
+ "name": "",
+ "short_name": "",
+ "icons": [
+ {
+ "src": "/android-chrome-192x192.png",
+ "sizes": "192x192",
+ "type": "image/png"
+ },
+ {
+ "src": "/android-chrome-512x512.png",
+ "sizes": "512x512",
+ "type": "image/png"
+ }
+ ],
+ "theme_color": "#ffffff",
+ "background_color": "#ffffff",
+ "display": "standalone"
+}
diff --git a/themes/grusp_conf/source/assets/fonts/Montserrat-Black.eot b/themes/grusp_conf/source/assets/fonts/Montserrat-Black.eot
new file mode 100644
index 0000000..64a52c9
Binary files /dev/null and b/themes/grusp_conf/source/assets/fonts/Montserrat-Black.eot differ
diff --git a/themes/grusp_conf/source/assets/fonts/Montserrat-Black.svg b/themes/grusp_conf/source/assets/fonts/Montserrat-Black.svg
new file mode 100644
index 0000000..73c39c3
--- /dev/null
+++ b/themes/grusp_conf/source/assets/fonts/Montserrat-Black.svg
@@ -0,0 +1,17675 @@
+
+
+
diff --git a/themes/grusp_conf/source/assets/fonts/Montserrat-Black.ttf b/themes/grusp_conf/source/assets/fonts/Montserrat-Black.ttf
new file mode 100644
index 0000000..39cc73f
Binary files /dev/null and b/themes/grusp_conf/source/assets/fonts/Montserrat-Black.ttf differ
diff --git a/themes/grusp_conf/source/assets/fonts/Montserrat-Black.woff b/themes/grusp_conf/source/assets/fonts/Montserrat-Black.woff
new file mode 100644
index 0000000..40a953c
Binary files /dev/null and b/themes/grusp_conf/source/assets/fonts/Montserrat-Black.woff differ
diff --git a/themes/grusp_conf/source/assets/fonts/Montserrat-Black.woff2 b/themes/grusp_conf/source/assets/fonts/Montserrat-Black.woff2
new file mode 100644
index 0000000..5f6e328
Binary files /dev/null and b/themes/grusp_conf/source/assets/fonts/Montserrat-Black.woff2 differ
diff --git a/themes/grusp_conf/source/assets/fonts/Montserrat-BlackItalic.eot b/themes/grusp_conf/source/assets/fonts/Montserrat-BlackItalic.eot
new file mode 100644
index 0000000..86872d8
Binary files /dev/null and b/themes/grusp_conf/source/assets/fonts/Montserrat-BlackItalic.eot differ
diff --git a/themes/grusp_conf/source/assets/fonts/Montserrat-BlackItalic.svg b/themes/grusp_conf/source/assets/fonts/Montserrat-BlackItalic.svg
new file mode 100644
index 0000000..438643b
--- /dev/null
+++ b/themes/grusp_conf/source/assets/fonts/Montserrat-BlackItalic.svg
@@ -0,0 +1,18164 @@
+
+
+
diff --git a/themes/grusp_conf/source/assets/fonts/Montserrat-BlackItalic.ttf b/themes/grusp_conf/source/assets/fonts/Montserrat-BlackItalic.ttf
new file mode 100644
index 0000000..dd24c05
Binary files /dev/null and b/themes/grusp_conf/source/assets/fonts/Montserrat-BlackItalic.ttf differ
diff --git a/themes/grusp_conf/source/assets/fonts/Montserrat-BlackItalic.woff b/themes/grusp_conf/source/assets/fonts/Montserrat-BlackItalic.woff
new file mode 100644
index 0000000..beba8f9
Binary files /dev/null and b/themes/grusp_conf/source/assets/fonts/Montserrat-BlackItalic.woff differ
diff --git a/themes/grusp_conf/source/assets/fonts/Montserrat-BlackItalic.woff2 b/themes/grusp_conf/source/assets/fonts/Montserrat-BlackItalic.woff2
new file mode 100644
index 0000000..d9c4608
Binary files /dev/null and b/themes/grusp_conf/source/assets/fonts/Montserrat-BlackItalic.woff2 differ
diff --git a/themes/grusp_conf/source/assets/fonts/Montserrat-Bold.eot b/themes/grusp_conf/source/assets/fonts/Montserrat-Bold.eot
new file mode 100644
index 0000000..ef01a8c
Binary files /dev/null and b/themes/grusp_conf/source/assets/fonts/Montserrat-Bold.eot differ
diff --git a/themes/grusp_conf/source/assets/fonts/Montserrat-Bold.svg b/themes/grusp_conf/source/assets/fonts/Montserrat-Bold.svg
new file mode 100644
index 0000000..931e501
--- /dev/null
+++ b/themes/grusp_conf/source/assets/fonts/Montserrat-Bold.svg
@@ -0,0 +1,20415 @@
+
+
+
diff --git a/themes/grusp_conf/source/assets/fonts/Montserrat-Bold.ttf b/themes/grusp_conf/source/assets/fonts/Montserrat-Bold.ttf
new file mode 100644
index 0000000..baaf757
Binary files /dev/null and b/themes/grusp_conf/source/assets/fonts/Montserrat-Bold.ttf differ
diff --git a/themes/grusp_conf/source/assets/fonts/Montserrat-Bold.woff b/themes/grusp_conf/source/assets/fonts/Montserrat-Bold.woff
new file mode 100644
index 0000000..fc69c25
Binary files /dev/null and b/themes/grusp_conf/source/assets/fonts/Montserrat-Bold.woff differ
diff --git a/themes/grusp_conf/source/assets/fonts/Montserrat-Bold.woff2 b/themes/grusp_conf/source/assets/fonts/Montserrat-Bold.woff2
new file mode 100644
index 0000000..2bd5c2c
Binary files /dev/null and b/themes/grusp_conf/source/assets/fonts/Montserrat-Bold.woff2 differ
diff --git a/themes/grusp_conf/source/assets/fonts/Montserrat-BoldItalic.eot b/themes/grusp_conf/source/assets/fonts/Montserrat-BoldItalic.eot
new file mode 100644
index 0000000..d5162e0
Binary files /dev/null and b/themes/grusp_conf/source/assets/fonts/Montserrat-BoldItalic.eot differ
diff --git a/themes/grusp_conf/source/assets/fonts/Montserrat-BoldItalic.svg b/themes/grusp_conf/source/assets/fonts/Montserrat-BoldItalic.svg
new file mode 100644
index 0000000..fa0fe19
--- /dev/null
+++ b/themes/grusp_conf/source/assets/fonts/Montserrat-BoldItalic.svg
@@ -0,0 +1,20892 @@
+
+
+
diff --git a/themes/grusp_conf/source/assets/fonts/Montserrat-BoldItalic.ttf b/themes/grusp_conf/source/assets/fonts/Montserrat-BoldItalic.ttf
new file mode 100644
index 0000000..51108e8
Binary files /dev/null and b/themes/grusp_conf/source/assets/fonts/Montserrat-BoldItalic.ttf differ
diff --git a/themes/grusp_conf/source/assets/fonts/Montserrat-BoldItalic.woff b/themes/grusp_conf/source/assets/fonts/Montserrat-BoldItalic.woff
new file mode 100644
index 0000000..4ae322a
Binary files /dev/null and b/themes/grusp_conf/source/assets/fonts/Montserrat-BoldItalic.woff differ
diff --git a/themes/grusp_conf/source/assets/fonts/Montserrat-BoldItalic.woff2 b/themes/grusp_conf/source/assets/fonts/Montserrat-BoldItalic.woff2
new file mode 100644
index 0000000..dea4e11
Binary files /dev/null and b/themes/grusp_conf/source/assets/fonts/Montserrat-BoldItalic.woff2 differ
diff --git a/themes/grusp_conf/source/assets/fonts/Montserrat-Italic.eot b/themes/grusp_conf/source/assets/fonts/Montserrat-Italic.eot
new file mode 100644
index 0000000..e69d2b4
Binary files /dev/null and b/themes/grusp_conf/source/assets/fonts/Montserrat-Italic.eot differ
diff --git a/themes/grusp_conf/source/assets/fonts/Montserrat-Italic.svg b/themes/grusp_conf/source/assets/fonts/Montserrat-Italic.svg
new file mode 100644
index 0000000..fd63631
--- /dev/null
+++ b/themes/grusp_conf/source/assets/fonts/Montserrat-Italic.svg
@@ -0,0 +1,20886 @@
+
+
+
diff --git a/themes/grusp_conf/source/assets/fonts/Montserrat-Italic.ttf b/themes/grusp_conf/source/assets/fonts/Montserrat-Italic.ttf
new file mode 100644
index 0000000..c2292ae
Binary files /dev/null and b/themes/grusp_conf/source/assets/fonts/Montserrat-Italic.ttf differ
diff --git a/themes/grusp_conf/source/assets/fonts/Montserrat-Italic.woff b/themes/grusp_conf/source/assets/fonts/Montserrat-Italic.woff
new file mode 100644
index 0000000..56c4030
Binary files /dev/null and b/themes/grusp_conf/source/assets/fonts/Montserrat-Italic.woff differ
diff --git a/themes/grusp_conf/source/assets/fonts/Montserrat-Italic.woff2 b/themes/grusp_conf/source/assets/fonts/Montserrat-Italic.woff2
new file mode 100644
index 0000000..f385605
Binary files /dev/null and b/themes/grusp_conf/source/assets/fonts/Montserrat-Italic.woff2 differ
diff --git a/themes/grusp_conf/source/assets/fonts/Montserrat-Regular.eot b/themes/grusp_conf/source/assets/fonts/Montserrat-Regular.eot
new file mode 100644
index 0000000..ea33788
Binary files /dev/null and b/themes/grusp_conf/source/assets/fonts/Montserrat-Regular.eot differ
diff --git a/themes/grusp_conf/source/assets/fonts/Montserrat-Regular.svg b/themes/grusp_conf/source/assets/fonts/Montserrat-Regular.svg
new file mode 100644
index 0000000..cd67fda
--- /dev/null
+++ b/themes/grusp_conf/source/assets/fonts/Montserrat-Regular.svg
@@ -0,0 +1,20401 @@
+
+
+
diff --git a/themes/grusp_conf/source/assets/fonts/Montserrat-Regular.ttf b/themes/grusp_conf/source/assets/fonts/Montserrat-Regular.ttf
new file mode 100644
index 0000000..c93d744
Binary files /dev/null and b/themes/grusp_conf/source/assets/fonts/Montserrat-Regular.ttf differ
diff --git a/themes/grusp_conf/source/assets/fonts/Montserrat-Regular.woff b/themes/grusp_conf/source/assets/fonts/Montserrat-Regular.woff
new file mode 100644
index 0000000..34fe8bc
Binary files /dev/null and b/themes/grusp_conf/source/assets/fonts/Montserrat-Regular.woff differ
diff --git a/themes/grusp_conf/source/assets/fonts/Montserrat-Regular.woff2 b/themes/grusp_conf/source/assets/fonts/Montserrat-Regular.woff2
new file mode 100644
index 0000000..cebd814
Binary files /dev/null and b/themes/grusp_conf/source/assets/fonts/Montserrat-Regular.woff2 differ
diff --git a/themes/grusp_conf/source/assets/ico/ico-about.svg b/themes/grusp_conf/source/assets/ico/ico-about.svg
new file mode 100644
index 0000000..eb9aa76
--- /dev/null
+++ b/themes/grusp_conf/source/assets/ico/ico-about.svg
@@ -0,0 +1,25 @@
+
+
+
diff --git a/themes/grusp_conf/source/assets/ico/ico-bolt.svg b/themes/grusp_conf/source/assets/ico/ico-bolt.svg
new file mode 100644
index 0000000..2079dde
--- /dev/null
+++ b/themes/grusp_conf/source/assets/ico/ico-bolt.svg
@@ -0,0 +1,4 @@
+
+
\ No newline at end of file
diff --git a/themes/grusp_conf/source/assets/ico/ico-calendar.svg b/themes/grusp_conf/source/assets/ico/ico-calendar.svg
new file mode 100644
index 0000000..3752983
--- /dev/null
+++ b/themes/grusp_conf/source/assets/ico/ico-calendar.svg
@@ -0,0 +1,14 @@
+
+
+
diff --git a/themes/grusp_conf/source/assets/ico/ico-cfp.svg b/themes/grusp_conf/source/assets/ico/ico-cfp.svg
new file mode 100644
index 0000000..0698a9e
--- /dev/null
+++ b/themes/grusp_conf/source/assets/ico/ico-cfp.svg
@@ -0,0 +1,39 @@
+
+
+
diff --git a/themes/grusp_conf/source/assets/ico/ico-clock.svg b/themes/grusp_conf/source/assets/ico/ico-clock.svg
new file mode 100644
index 0000000..0cd57a7
--- /dev/null
+++ b/themes/grusp_conf/source/assets/ico/ico-clock.svg
@@ -0,0 +1,25 @@
+
+
+
diff --git a/themes/grusp_conf/source/assets/ico/ico-coc.svg b/themes/grusp_conf/source/assets/ico/ico-coc.svg
new file mode 100644
index 0000000..39f669c
--- /dev/null
+++ b/themes/grusp_conf/source/assets/ico/ico-coc.svg
@@ -0,0 +1,32 @@
+
+
+
diff --git a/themes/grusp_conf/source/assets/ico/ico-coffee.png b/themes/grusp_conf/source/assets/ico/ico-coffee.png
new file mode 100644
index 0000000..21d9acd
Binary files /dev/null and b/themes/grusp_conf/source/assets/ico/ico-coffee.png differ
diff --git a/themes/grusp_conf/source/assets/ico/ico-coffee.svg b/themes/grusp_conf/source/assets/ico/ico-coffee.svg
new file mode 100644
index 0000000..3c6e11a
--- /dev/null
+++ b/themes/grusp_conf/source/assets/ico/ico-coffee.svg
@@ -0,0 +1,8 @@
+
+
+
diff --git a/themes/grusp_conf/source/assets/ico/ico-cutlery.png b/themes/grusp_conf/source/assets/ico/ico-cutlery.png
new file mode 100644
index 0000000..3555670
Binary files /dev/null and b/themes/grusp_conf/source/assets/ico/ico-cutlery.png differ
diff --git a/themes/grusp_conf/source/assets/ico/ico-cutlery.svg b/themes/grusp_conf/source/assets/ico/ico-cutlery.svg
new file mode 100644
index 0000000..25ca272
--- /dev/null
+++ b/themes/grusp_conf/source/assets/ico/ico-cutlery.svg
@@ -0,0 +1,9 @@
+
+
+
diff --git a/themes/grusp_conf/source/assets/ico/ico-glass.png b/themes/grusp_conf/source/assets/ico/ico-glass.png
new file mode 100644
index 0000000..46d40f4
Binary files /dev/null and b/themes/grusp_conf/source/assets/ico/ico-glass.png differ
diff --git a/themes/grusp_conf/source/assets/ico/ico-glass.svg b/themes/grusp_conf/source/assets/ico/ico-glass.svg
new file mode 100644
index 0000000..22ab428
--- /dev/null
+++ b/themes/grusp_conf/source/assets/ico/ico-glass.svg
@@ -0,0 +1,12 @@
+
+
+
diff --git a/themes/grusp_conf/source/assets/ico/ico-hotel.svg b/themes/grusp_conf/source/assets/ico/ico-hotel.svg
new file mode 100644
index 0000000..f635591
--- /dev/null
+++ b/themes/grusp_conf/source/assets/ico/ico-hotel.svg
@@ -0,0 +1,24 @@
+
+
+
diff --git a/themes/grusp_conf/source/assets/ico/ico-online-conference-120.svg b/themes/grusp_conf/source/assets/ico/ico-online-conference-120.svg
new file mode 100644
index 0000000..41d84b3
--- /dev/null
+++ b/themes/grusp_conf/source/assets/ico/ico-online-conference-120.svg
@@ -0,0 +1,25 @@
+
+
+
diff --git a/themes/grusp_conf/source/assets/ico/ico-online-conference.svg b/themes/grusp_conf/source/assets/ico/ico-online-conference.svg
new file mode 100644
index 0000000..d84d78f
--- /dev/null
+++ b/themes/grusp_conf/source/assets/ico/ico-online-conference.svg
@@ -0,0 +1,25 @@
+
+
+
diff --git a/themes/grusp_conf/source/assets/ico/ico-pencil.svg b/themes/grusp_conf/source/assets/ico/ico-pencil.svg
new file mode 100644
index 0000000..66636a4
--- /dev/null
+++ b/themes/grusp_conf/source/assets/ico/ico-pencil.svg
@@ -0,0 +1,12 @@
+
+
+
diff --git a/themes/grusp_conf/source/assets/ico/ico-readmore.svg b/themes/grusp_conf/source/assets/ico/ico-readmore.svg
new file mode 100644
index 0000000..a13de63
--- /dev/null
+++ b/themes/grusp_conf/source/assets/ico/ico-readmore.svg
@@ -0,0 +1,19 @@
+
+
+
diff --git a/themes/grusp_conf/source/assets/ico/ico-safety.svg b/themes/grusp_conf/source/assets/ico/ico-safety.svg
new file mode 100644
index 0000000..5c1a3e0
--- /dev/null
+++ b/themes/grusp_conf/source/assets/ico/ico-safety.svg
@@ -0,0 +1,4 @@
+
\ No newline at end of file
diff --git a/themes/grusp_conf/source/assets/ico/ico-scholarship.svg b/themes/grusp_conf/source/assets/ico/ico-scholarship.svg
new file mode 100644
index 0000000..1e64b5d
--- /dev/null
+++ b/themes/grusp_conf/source/assets/ico/ico-scholarship.svg
@@ -0,0 +1,16 @@
+
+
+
diff --git a/themes/grusp_conf/source/assets/ico/ico-social-facebook.svg b/themes/grusp_conf/source/assets/ico/ico-social-facebook.svg
new file mode 100644
index 0000000..560ab7f
--- /dev/null
+++ b/themes/grusp_conf/source/assets/ico/ico-social-facebook.svg
@@ -0,0 +1,8 @@
+
+
+
diff --git a/themes/grusp_conf/source/assets/ico/ico-social-github.svg b/themes/grusp_conf/source/assets/ico/ico-social-github.svg
new file mode 100644
index 0000000..ec48e18
--- /dev/null
+++ b/themes/grusp_conf/source/assets/ico/ico-social-github.svg
@@ -0,0 +1,15 @@
+
+
+
diff --git a/themes/grusp_conf/source/assets/ico/ico-social-instagram.svg b/themes/grusp_conf/source/assets/ico/ico-social-instagram.svg
new file mode 100644
index 0000000..c54c6c5
--- /dev/null
+++ b/themes/grusp_conf/source/assets/ico/ico-social-instagram.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/themes/grusp_conf/source/assets/ico/ico-social-linkedin.svg b/themes/grusp_conf/source/assets/ico/ico-social-linkedin.svg
new file mode 100644
index 0000000..9d810f0
--- /dev/null
+++ b/themes/grusp_conf/source/assets/ico/ico-social-linkedin.svg
@@ -0,0 +1,11 @@
+
+
+
diff --git a/themes/grusp_conf/source/assets/ico/ico-social-mastodon.svg b/themes/grusp_conf/source/assets/ico/ico-social-mastodon.svg
new file mode 100644
index 0000000..c577b9f
--- /dev/null
+++ b/themes/grusp_conf/source/assets/ico/ico-social-mastodon.svg
@@ -0,0 +1,11 @@
+
+
\ No newline at end of file
diff --git a/themes/grusp_conf/source/assets/ico/ico-social-twitter.svg b/themes/grusp_conf/source/assets/ico/ico-social-twitter.svg
new file mode 100644
index 0000000..10dec69
--- /dev/null
+++ b/themes/grusp_conf/source/assets/ico/ico-social-twitter.svg
@@ -0,0 +1,11 @@
+
+
\ No newline at end of file
diff --git a/themes/grusp_conf/source/assets/ico/ico-social-vimeo.svg b/themes/grusp_conf/source/assets/ico/ico-social-vimeo.svg
new file mode 100644
index 0000000..aecf96d
--- /dev/null
+++ b/themes/grusp_conf/source/assets/ico/ico-social-vimeo.svg
@@ -0,0 +1,18 @@
+
+
+
diff --git a/themes/grusp_conf/source/assets/ico/ico-social-youtube.svg b/themes/grusp_conf/source/assets/ico/ico-social-youtube.svg
new file mode 100644
index 0000000..7e6202b
--- /dev/null
+++ b/themes/grusp_conf/source/assets/ico/ico-social-youtube.svg
@@ -0,0 +1,29 @@
+
+
+
diff --git a/themes/grusp_conf/source/assets/ico/ico-streaming.svg b/themes/grusp_conf/source/assets/ico/ico-streaming.svg
new file mode 100644
index 0000000..b122cee
--- /dev/null
+++ b/themes/grusp_conf/source/assets/ico/ico-streaming.svg
@@ -0,0 +1,17 @@
+
+
+
diff --git a/themes/grusp_conf/source/assets/ico/ico-teacher.svg b/themes/grusp_conf/source/assets/ico/ico-teacher.svg
new file mode 100644
index 0000000..37ae8ee
--- /dev/null
+++ b/themes/grusp_conf/source/assets/ico/ico-teacher.svg
@@ -0,0 +1,12 @@
+
+
+
diff --git a/themes/grusp_conf/source/assets/ico/ico-ticket.svg b/themes/grusp_conf/source/assets/ico/ico-ticket.svg
new file mode 100644
index 0000000..bed2f03
--- /dev/null
+++ b/themes/grusp_conf/source/assets/ico/ico-ticket.svg
@@ -0,0 +1,23 @@
+
+
+
diff --git a/themes/grusp_conf/source/assets/ico/ico-warning.svg b/themes/grusp_conf/source/assets/ico/ico-warning.svg
new file mode 100644
index 0000000..729f6fa
--- /dev/null
+++ b/themes/grusp_conf/source/assets/ico/ico-warning.svg
@@ -0,0 +1,16 @@
+
+
+
diff --git a/themes/grusp_conf/source/assets/ico/ico-where-120.svg b/themes/grusp_conf/source/assets/ico/ico-where-120.svg
new file mode 100644
index 0000000..0cb5dc0
--- /dev/null
+++ b/themes/grusp_conf/source/assets/ico/ico-where-120.svg
@@ -0,0 +1,9 @@
+
+
+
diff --git a/themes/grusp_conf/source/assets/ico/ico-where.svg b/themes/grusp_conf/source/assets/ico/ico-where.svg
new file mode 100644
index 0000000..c45196d
--- /dev/null
+++ b/themes/grusp_conf/source/assets/ico/ico-where.svg
@@ -0,0 +1,9 @@
+
+
+
diff --git a/themes/grusp_conf/source/assets/ico/ico-world.svg b/themes/grusp_conf/source/assets/ico/ico-world.svg
new file mode 100644
index 0000000..ea1516c
--- /dev/null
+++ b/themes/grusp_conf/source/assets/ico/ico-world.svg
@@ -0,0 +1,66 @@
+
+
+
diff --git a/themes/grusp_conf/source/assets/img/conference-logo.png b/themes/grusp_conf/source/assets/img/conference-logo.png
new file mode 100644
index 0000000..bc34163
Binary files /dev/null and b/themes/grusp_conf/source/assets/img/conference-logo.png differ
diff --git a/themes/grusp_conf/source/assets/img/conference-logo.svg b/themes/grusp_conf/source/assets/img/conference-logo.svg
new file mode 100644
index 0000000..a53762a
--- /dev/null
+++ b/themes/grusp_conf/source/assets/img/conference-logo.svg
@@ -0,0 +1,53 @@
+
+
+
diff --git a/themes/grusp_conf/source/assets/img/grusp-logo-full.png b/themes/grusp_conf/source/assets/img/grusp-logo-full.png
new file mode 100644
index 0000000..bb32e28
Binary files /dev/null and b/themes/grusp_conf/source/assets/img/grusp-logo-full.png differ
diff --git a/themes/grusp_conf/source/assets/img/grusp-logo-full.svg b/themes/grusp_conf/source/assets/img/grusp-logo-full.svg
new file mode 100644
index 0000000..08046bf
--- /dev/null
+++ b/themes/grusp_conf/source/assets/img/grusp-logo-full.svg
@@ -0,0 +1,177 @@
+
+
+
diff --git a/themes/grusp_conf/source/assets/img/grusp-logo-orig.svg b/themes/grusp_conf/source/assets/img/grusp-logo-orig.svg
new file mode 100644
index 0000000..833cac5
--- /dev/null
+++ b/themes/grusp_conf/source/assets/img/grusp-logo-orig.svg
@@ -0,0 +1,89 @@
+
+
+
+
diff --git a/themes/grusp_conf/source/assets/img/hero/hero-online.jpg b/themes/grusp_conf/source/assets/img/hero/hero-online.jpg
new file mode 100644
index 0000000..dfb03a4
Binary files /dev/null and b/themes/grusp_conf/source/assets/img/hero/hero-online.jpg differ
diff --git a/themes/grusp_conf/source/assets/img/hero/hero.jpg b/themes/grusp_conf/source/assets/img/hero/hero.jpg
new file mode 100644
index 0000000..dfb03a4
Binary files /dev/null and b/themes/grusp_conf/source/assets/img/hero/hero.jpg differ
diff --git a/themes/grusp_conf/source/assets/img/social-1200x630.png b/themes/grusp_conf/source/assets/img/social-1200x630.png
new file mode 100644
index 0000000..a52815f
Binary files /dev/null and b/themes/grusp_conf/source/assets/img/social-1200x630.png differ
diff --git a/themes/grusp_conf/source/assets/img/venue/venue-online.jpg b/themes/grusp_conf/source/assets/img/venue/venue-online.jpg
new file mode 100644
index 0000000..bef450f
Binary files /dev/null and b/themes/grusp_conf/source/assets/img/venue/venue-online.jpg differ
diff --git a/themes/grusp_conf/source/assets/img/venue/venue.jpg b/themes/grusp_conf/source/assets/img/venue/venue.jpg
new file mode 100644
index 0000000..bef450f
Binary files /dev/null and b/themes/grusp_conf/source/assets/img/venue/venue.jpg differ
diff --git a/themes/grusp_conf/source/assets/img/workshop/worskhop_header-online.jpg b/themes/grusp_conf/source/assets/img/workshop/worskhop_header-online.jpg
new file mode 100644
index 0000000..95e4882
Binary files /dev/null and b/themes/grusp_conf/source/assets/img/workshop/worskhop_header-online.jpg differ
diff --git a/themes/grusp_conf/source/assets/img/workshop/worskhop_header.jpg b/themes/grusp_conf/source/assets/img/workshop/worskhop_header.jpg
new file mode 100644
index 0000000..95e4882
Binary files /dev/null and b/themes/grusp_conf/source/assets/img/workshop/worskhop_header.jpg differ
diff --git a/themes/grusp_conf/source/assets/js/back_to_top.js b/themes/grusp_conf/source/assets/js/back_to_top.js
new file mode 100644
index 0000000..676124e
--- /dev/null
+++ b/themes/grusp_conf/source/assets/js/back_to_top.js
@@ -0,0 +1,10 @@
+window.addEventListener("scroll", function () {
+ "use strict";
+ var backToTop = document.getElementById('back_to_top');
+ if (document.body.scrollTop >= document.body.clientHeight || document.documentElement.scrollTop >= document.documentElement.clientHeight) {
+ backToTop.classList.remove("is-hidden");
+ }
+ else {
+ backToTop.classList.add("is-hidden");
+ }
+});
\ No newline at end of file
diff --git a/themes/grusp_conf/source/assets/js/header.js b/themes/grusp_conf/source/assets/js/header.js
new file mode 100644
index 0000000..9556dfa
--- /dev/null
+++ b/themes/grusp_conf/source/assets/js/header.js
@@ -0,0 +1,12 @@
+document.addEventListener("DOMContentLoaded", () => {
+ var myNav = document.getElementById('header');
+ window.onscroll = function () {
+ "use strict";
+ if (document.body.scrollTop >= 30 || document.documentElement.scrollTop >= 30) {
+ myNav.classList.remove("is-transparent");
+ }
+ else {
+ myNav.classList.add("is-transparent");
+ }
+ }
+});
\ No newline at end of file
diff --git a/themes/grusp_conf/source/assets/js/layout/components/hero/hero.js b/themes/grusp_conf/source/assets/js/layout/components/hero/hero.js
new file mode 100644
index 0000000..ab2bcfa
--- /dev/null
+++ b/themes/grusp_conf/source/assets/js/layout/components/hero/hero.js
@@ -0,0 +1,85 @@
+const countDownClock = (dateEvent) => {
+ let number = 60;
+ let format = 'days';
+
+ // Get timestamps
+ var unixTime = new Date(dateEvent).getTime();
+ if (!unixTime) return;
+ var now = new Date().getTime();
+
+ // Calculate difference
+ var difference = (unixTime / 1000) - (now / 1000);
+
+ // Convert difference to absolute
+ difference = Math.abs(difference);
+
+ // Calculate time unit
+ if (difference / (60 * 60 * 24) >= 1) {
+ // Days
+ format = 'days';
+ number = difference / (60 * 60 * 24);
+ difference = difference - number;
+ }
+ if (difference / (60 * 60) >= 1) {
+ // Hours
+ format = 'hours';
+ number = difference / (60 * 60);
+ difference = difference - number;
+ }
+ if (difference / 60 >= 1) {
+ // Minutes
+ format = 'minutes';
+ number = difference / 60;
+ difference = difference - number;
+ }
+ else {
+ // Seconds
+ format = 'seconds';
+ number = difference;
+ }
+
+ const d = document;
+ const daysElement = d.querySelector('.days');
+ const hoursElement = d.querySelector('.hours');
+ const minutesElement = d.querySelector('.minutes');
+ const secondsElement = d.querySelector('.seconds');
+ let countdown;
+ convertFormat(format);
+
+ function convertFormat(format) {
+ switch (format) {
+ case 'seconds':
+ return timer(number);
+ case 'minutes':
+ return timer(number * 60);
+ case 'hours':
+ return timer(number * 60 * 60);
+ case 'days':
+ return timer(number * 60 * 60 * 24);
+ }
+ }
+
+ function timer(seconds) {
+ const now = Date.now();
+ const then = now + seconds * 1000;
+
+ countdown = setInterval(() => {
+ const secondsLeft = Math.round((then - Date.now()) / 1000);
+
+ if (secondsLeft <= 0) {
+ clearInterval(countdown);
+ return;
+ };
+
+ displayTimeLeft(secondsLeft);
+
+ }, 1000);
+ }
+
+ function displayTimeLeft(seconds) {
+ daysElement.textContent = Math.floor(seconds / 86400);
+ hoursElement.textContent = Math.floor((seconds % 86400) / 3600);
+ minutesElement.textContent = Math.floor((seconds % 86400) % 3600 / 60);
+ secondsElement.textContent = seconds % 60 < 10 ? `0${seconds % 60}` : seconds % 60;
+ }
+}
diff --git a/themes/grusp_conf/source/assets/js/layout/components/newsletter/mc-validate.js b/themes/grusp_conf/source/assets/js/layout/components/newsletter/mc-validate.js
new file mode 100644
index 0000000..ddf1ae3
--- /dev/null
+++ b/themes/grusp_conf/source/assets/js/layout/components/newsletter/mc-validate.js
@@ -0,0 +1,614 @@
+// A Validity State Polyfill
+; (function (window, document, undefined) {
+
+ 'use strict';
+
+ // Make sure that ValidityState is supported in full (all features)
+ var supported = function () {
+ var input = document.createElement('input');
+ return ('validity' in input && 'badInput' in input.validity && 'patternMismatch' in input.validity && 'rangeOverflow' in input.validity && 'rangeUnderflow' in input.validity && 'stepMismatch' in input.validity && 'tooLong' in input.validity && 'tooShort' in input.validity && 'typeMismatch' in input.validity && 'valid' in input.validity && 'valueMissing' in input.validity);
+ };
+
+ /**
+ * Generate the field validity object
+ * @param {Node]} field The field to validate
+ * @return {Object} The validity object
+ */
+ var getValidityState = function (field) {
+
+ // Variables
+ var type = field.getAttribute('type') || input.nodeName.toLowerCase();
+ var isNum = type === 'number' || type === 'range';
+ var length = field.value.length;
+ var valid = true;
+
+ // If radio group, get selected field
+ if (field.type === 'radio' && field.name) {
+ var group = document.getElementsByName(field.name);
+ if (group.length > 0) {
+ for (var i = 0; i < group.length; i++) {
+ if (group[i].form === field.form && field.checked) {
+ field = group[i];
+ break;
+ }
+ }
+ }
+ }
+
+ // Run validity checks
+ var checkValidity = {
+ badInput: (isNum && length > 0 && !/[-+]?[0-9]/.test(field.value)), // value of a number field is not a number
+ patternMismatch: (field.hasAttribute('pattern') && length > 0 && new RegExp(field.getAttribute('pattern')).test(field.value) === false), // value does not conform to the pattern
+ rangeOverflow: (field.hasAttribute('max') && isNum && field.value > 0 && Number(field.value) > Number(field.getAttribute('max'))), // value of a number field is higher than the max attribute
+ rangeUnderflow: (field.hasAttribute('min') && isNum && field.value > 0 && Number(field.value) < Number(field.getAttribute('min'))), // value of a number field is lower than the min attribute
+ stepMismatch: (isNum && ((field.hasAttribute('step') && field.getAttribute('step') !== 'any' && Number(field.value) % Number(field.getAttribute('step')) !== 0) || (!field.hasAttribute('step') && Number(field.value) % 1 !== 0))), // value of a number field does not conform to the stepattribute
+ tooLong: (field.hasAttribute('maxLength') && field.getAttribute('maxLength') > 0 && length > parseInt(field.getAttribute('maxLength'), 10)), // the user has edited a too-long value in a field with maxlength
+ tooShort: (field.hasAttribute('minLength') && field.getAttribute('minLength') > 0 && length > 0 && length < parseInt(field.getAttribute('minLength'), 10)), // the user has edited a too-short value in a field with minlength
+ typeMismatch: (length > 0 && ((type === 'email' && !/^([^\x00-\x20\x22\x28\x29\x2c\x2e\x3a-\x3c\x3e\x40\x5b-\x5d\x7f-\xff]+|\x22([^\x0d\x22\x5c\x80-\xff]|\x5c[\x00-\x7f])*\x22)(\x2e([^\x00-\x20\x22\x28\x29\x2c\x2e\x3a-\x3c\x3e\x40\x5b-\x5d\x7f-\xff]+|\x22([^\x0d\x22\x5c\x80-\xff]|\x5c[\x00-\x7f])*\x22))*\x40([^\x00-\x20\x22\x28\x29\x2c\x2e\x3a-\x3c\x3e\x40\x5b-\x5d\x7f-\xff]+|\x5b([^\x0d\x5b-\x5d\x80-\xff]|\x5c[\x00-\x7f])*\x5d)(\x2e([^\x00-\x20\x22\x28\x29\x2c\x2e\x3a-\x3c\x3e\x40\x5b-\x5d\x7f-\xff]+|\x5b([^\x0d\x5b-\x5d\x80-\xff]|\x5c[\x00-\x7f])*\x5d))*$/.test(field.value)) || (type === 'url' && !/^(?:(?:https?|HTTPS?|ftp|FTP):\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-zA-Z\u00a1-\uffff0-9]-*)*[a-zA-Z\u00a1-\uffff0-9]+)(?:\.(?:[a-zA-Z\u00a1-\uffff0-9]-*)*[a-zA-Z\u00a1-\uffff0-9]+)*)(?::\d{2,5})?(?:[\/?#]\S*)?$/.test(field.value)))), // value of a email or URL field is not an email address or URL
+ valueMissing: (field.hasAttribute('required') && (((type === 'checkbox' || type === 'radio') && !field.checked) || (type === 'select' && field.options[field.selectedIndex].value < 1) || (type !== 'checkbox' && type !== 'radio' && type !== 'select' && length < 1))) // required field without a value
+ };
+
+ // Check if any errors
+ for (var key in checkValidity) {
+ if (checkValidity.hasOwnProperty(key)) {
+ // If there's an error, change valid value
+ if (checkValidity[key]) {
+ valid = false;
+ break;
+ }
+ }
+ }
+
+ // Add valid property to validity object
+ checkValidity.valid = valid;
+
+ // Return object
+ return checkValidity;
+
+ };
+
+ // If the full set of ValidityState features aren't supported, polyfill
+ // if (!supported()) {
+ Object.defineProperty(HTMLInputElement.prototype, 'validity', {
+ get: function ValidityState() {
+ return getValidityState(this);
+ },
+ configurable: true,
+ });
+ // }
+
+})(window, document);
+
+
+/*
+ * classList.js: Cross-browser full element.classList implementation.
+ * 1.1.20170427
+ *
+ * By Eli Grey, http://eligrey.com
+ * License: Dedicated to the public domain.
+ * See https://github.com/eligrey/classList.js/blob/master/LICENSE.md
+ */
+
+/*global self, document, DOMException */
+
+/*! @source http://purl.eligrey.com/github/classList.js/blob/master/classList.js */
+
+if ("document" in self) {
+
+ // Full polyfill for browsers with no classList support
+ // Including IE < Edge missing SVGElement.classList
+ if (!("classList" in document.createElement("_"))
+ || document.createElementNS && !("classList" in document.createElementNS("http://www.w3.org/2000/svg", "g"))) {
+
+ (function (view) {
+
+ "use strict";
+
+ if (!('Element' in view)) return;
+
+ var
+ classListProp = "classList"
+ , protoProp = "prototype"
+ , elemCtrProto = view.Element[protoProp]
+ , objCtr = Object
+ , strTrim = String[protoProp].trim || function () {
+ return this.replace(/^\s+|\s+$/g, "");
+ }
+ , arrIndexOf = Array[protoProp].indexOf || function (item) {
+ var
+ i = 0
+ , len = this.length
+ ;
+ for (; i < len; i++) {
+ if (i in this && this[i] === item) {
+ return i;
+ }
+ }
+ return -1;
+ }
+ // Vendors: please allow content code to instantiate DOMExceptions
+ , DOMEx = function (type, message) {
+ this.name = type;
+ this.code = DOMException[type];
+ this.message = message;
+ }
+ , checkTokenAndGetIndex = function (classList, token) {
+ if (token === "") {
+ throw new DOMEx(
+ "SYNTAX_ERR"
+ , "An invalid or illegal string was specified"
+ );
+ }
+ if (/\s/.test(token)) {
+ throw new DOMEx(
+ "INVALID_CHARACTER_ERR"
+ , "String contains an invalid character"
+ );
+ }
+ return arrIndexOf.call(classList, token);
+ }
+ , ClassList = function (elem) {
+ var
+ trimmedClasses = strTrim.call(elem.getAttribute("class") || "")
+ , classes = trimmedClasses ? trimmedClasses.split(/\s+/) : []
+ , i = 0
+ , len = classes.length
+ ;
+ for (; i < len; i++) {
+ this.push(classes[i]);
+ }
+ this._updateClassName = function () {
+ elem.setAttribute("class", this.toString());
+ };
+ }
+ , classListProto = ClassList[protoProp] = []
+ , classListGetter = function () {
+ return new ClassList(this);
+ }
+ ;
+ // Most DOMException implementations don't allow calling DOMException's toString()
+ // on non-DOMExceptions. Error's toString() is sufficient here.
+ DOMEx[protoProp] = Error[protoProp];
+ classListProto.item = function (i) {
+ return this[i] || null;
+ };
+ classListProto.contains = function (token) {
+ token += "";
+ return checkTokenAndGetIndex(this, token) !== -1;
+ };
+ classListProto.add = function () {
+ var
+ tokens = arguments
+ , i = 0
+ , l = tokens.length
+ , token
+ , updated = false
+ ;
+ do {
+ token = tokens[i] + "";
+ if (checkTokenAndGetIndex(this, token) === -1) {
+ this.push(token);
+ updated = true;
+ }
+ }
+ while (++i < l);
+
+ if (updated) {
+ this._updateClassName();
+ }
+ };
+ classListProto.remove = function () {
+ var
+ tokens = arguments
+ , i = 0
+ , l = tokens.length
+ , token
+ , updated = false
+ , index
+ ;
+ do {
+ token = tokens[i] + "";
+ index = checkTokenAndGetIndex(this, token);
+ while (index !== -1) {
+ this.splice(index, 1);
+ updated = true;
+ index = checkTokenAndGetIndex(this, token);
+ }
+ }
+ while (++i < l);
+
+ if (updated) {
+ this._updateClassName();
+ }
+ };
+ classListProto.toggle = function (token, force) {
+ token += "";
+
+ var
+ result = this.contains(token)
+ , method = result ?
+ force !== true && "remove"
+ :
+ force !== false && "add"
+ ;
+
+ if (method) {
+ this[method](token);
+ }
+
+ if (force === true || force === false) {
+ return force;
+ } else {
+ return !result;
+ }
+ };
+ classListProto.toString = function () {
+ return this.join(" ");
+ };
+
+ if (objCtr.defineProperty) {
+ var classListPropDesc = {
+ get: classListGetter
+ , enumerable: true
+ , configurable: true
+ };
+ try {
+ objCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc);
+ } catch (ex) { // IE 8 doesn't support enumerable:true
+ // adding undefined to fight this issue https://github.com/eligrey/classList.js/issues/36
+ // modernie IE8-MSW7 machine has IE8 8.0.6001.18702 and is affected
+ if (ex.number === undefined || ex.number === -0x7FF5EC54) {
+ classListPropDesc.enumerable = false;
+ objCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc);
+ }
+ }
+ } else if (objCtr[protoProp].__defineGetter__) {
+ elemCtrProto.__defineGetter__(classListProp, classListGetter);
+ }
+
+ }(self));
+
+ }
+
+ // There is full or partial native classList support, so just check if we need
+ // to normalize the add/remove and toggle APIs.
+
+ (function () {
+ "use strict";
+
+ var testElement = document.createElement("_");
+
+ testElement.classList.add("c1", "c2");
+
+ // Polyfill for IE 10/11 and Firefox <26, where classList.add and
+ // classList.remove exist but support only one argument at a time.
+ if (!testElement.classList.contains("c2")) {
+ var createMethod = function (method) {
+ var original = DOMTokenList.prototype[method];
+
+ DOMTokenList.prototype[method] = function (token) {
+ var i, len = arguments.length;
+
+ for (i = 0; i < len; i++) {
+ token = arguments[i];
+ original.call(this, token);
+ }
+ };
+ };
+ createMethod('add');
+ createMethod('remove');
+ }
+
+ testElement.classList.toggle("c3", false);
+
+ // Polyfill for IE 10 and Firefox <24, where classList.toggle does not
+ // support the second argument.
+ if (testElement.classList.contains("c3")) {
+ var _toggle = DOMTokenList.prototype.toggle;
+
+ DOMTokenList.prototype.toggle = function (token, force) {
+ if (1 in arguments && !this.contains(token) === !force) {
+ return force;
+ } else {
+ return _toggle.call(this, token);
+ }
+ };
+
+ }
+
+ testElement = null;
+ }());
+
+}
+
+
+// Add the novalidate attribute when the JS loads
+var forms = document.querySelectorAll('.validate');
+for (var i = 0; i < forms.length; i++) {
+ forms[i].setAttribute('novalidate', true);
+}
+
+
+// Validate the field
+var hasError = function (field) {
+
+ // Don't validate submits, buttons, file and reset inputs, and disabled fields
+ if (field.disabled || field.type === 'file' || field.type === 'reset' || field.type === 'submit' || field.type === 'button') return;
+
+ // Get validity
+ var validity = field.validity;
+
+ // If valid, return null
+ if (validity.valid) return;
+
+ // If field is required and empty
+ if (validity.valueMissing) return 'Please fill out this field.';
+
+ // If not the right type
+ if (validity.typeMismatch) {
+
+ // Email
+ if (field.type === 'email') return 'Please enter an email address.';
+
+ // URL
+ if (field.type === 'url') return 'Please enter a URL.';
+
+ }
+
+ // If too short
+ if (validity.tooShort) return 'Please lengthen this text to ' + field.getAttribute('minLength') + ' characters or more. You are currently using ' + field.value.length + ' characters.';
+
+ // If too long
+ if (validity.tooLong) return 'Please shorten this text to no more than ' + field.getAttribute('maxLength') + ' characters. You are currently using ' + field.value.length + ' characters.';
+
+ // If pattern doesn't match
+ if (validity.patternMismatch) {
+
+ // If pattern info is included, return custom error
+ if (field.hasAttribute('title')) return field.getAttribute('title');
+
+ // Otherwise, generic error
+ return 'Please match the requested format.';
+
+ }
+
+ // If number input isn't a number
+ if (validity.badInput) return 'Please enter a number.';
+
+ // If a number value doesn't match the step interval
+ if (validity.stepMismatch) return 'Please select a valid value.';
+
+ // If a number field is over the max
+ if (validity.rangeOverflow) return 'Please select a value that is no more than ' + field.getAttribute('max') + '.';
+
+ // If a number field is below the min
+ if (validity.rangeUnderflow) return 'Please select a value that is no less than ' + field.getAttribute('min') + '.';
+
+ // If all else fails, return a generic catchall error
+ return 'The value you entered for this field is invalid.';
+
+};
+
+
+// Show an error message
+var showError = function (field, error) {
+
+ // Add error class to field
+ field.classList.add('error');
+
+ // If the field is a radio button and part of a group, error all and get the last item in the group
+ if (field.type === 'radio' && field.name) {
+ var group = field.form.querySelectorAll('[name="' + field.name + '"]');
+ if (group.length > 0) {
+ for (var i = 0; i < group.length; i++) {
+ group[i].classList.add('error');
+ }
+ field = group[group.length - 1];
+ }
+ }
+
+ // Get field id or name
+ var id = field.id || field.name;
+ if (!id) return;
+
+ // Check if error message field already exists
+ // If not, create one
+ var message = field.form.querySelector('.error-message#error-for-' + id);
+ if (!message) {
+ message = document.createElement('div');
+ message.className = 'error-message';
+ message.id = 'error-for-' + id;
+
+ // If the field is a radio button or checkbox, insert error after the label
+ var label;
+ if (field.type === 'radio' || field.type === 'checkbox') {
+ label = field.form.querySelector('label[for="' + id + '"]') || field.parentNode;
+ if (label) {
+ label.parentNode.insertBefore(message, label.nextSibling);
+ }
+ }
+
+ // Otherwise, insert it after the field
+ if (!label) {
+ field.parentNode.insertBefore(message, field.nextSibling);
+ }
+
+ }
+
+ // Add ARIA role to the field
+ field.setAttribute('aria-describedby', 'error-for-' + id);
+
+ // Update error message
+ message.innerHTML = error;
+
+ // Show error message
+ message.style.display = 'block';
+ message.style.visibility = 'visible';
+
+};
+
+
+// Remove the error message
+var removeError = function (field) {
+
+ // Remove error class to field
+ field.classList.remove('error');
+
+ // Remove ARIA role from the field
+ field.removeAttribute('aria-describedby');
+
+ // If the field is a radio button and part of a group, remove error from all and get the last item in the group
+ if (field.type === 'radio' && field.name) {
+ var group = field.form.querySelectorAll('[name="' + field.name + '"]');
+ if (group.length > 0) {
+ for (var i = 0; i < group.length; i++) {
+ group[i].classList.remove('error');
+ }
+ field = group[group.length - 1];
+ }
+ }
+
+ // Get field id or name
+ var id = field.id || field.name;
+ if (!id) return;
+
+
+ // Check if an error message is in the DOM
+ var message = field.form.querySelector('.error-message#error-for-' + id + '');
+ if (!message) return;
+
+ // If so, hide it
+ message.innerHTML = '';
+ message.style.display = 'none';
+ message.style.visibility = 'hidden';
+
+};
+
+// Serialize the form data into a query string
+// Forked and modified from https://stackoverflow.com/a/30153391/1293256
+var serialize = function (form) {
+
+ // Setup our serialized data
+ var serialized = '';
+
+ // Loop through each field in the form
+ for (i = 0; i < form.elements.length; i++) {
+
+ var field = form.elements[i];
+
+ // Don't serialize fields without a name, submits, buttons, file and reset inputs, and disabled fields
+ if (!field.name || field.disabled || field.type === 'file' || field.type === 'reset' || field.type === 'submit' || field.type === 'button') continue;
+
+ // Convert field data to a query string
+ if ((field.type !== 'checkbox' && field.type !== 'radio') || field.checked) {
+ serialized += '&' + encodeURIComponent(field.name) + "=" + encodeURIComponent(field.value);
+ }
+ }
+
+ return serialized;
+
+};
+
+// Display the form status
+window.displayMailChimpStatus = function (data) {
+
+ // Make sure the data is in the right format and that there's a status container
+ if (!data.result || !data.msg || !mcStatus) return;
+
+ // Update our status message
+ mcStatus.innerHTML = data.msg;
+
+ // If error, add error class
+ if (data.result === 'error') {
+ mcStatus.classList.remove('success-message');
+ mcStatus.classList.add('error-message');
+ return;
+ }
+
+ // Otherwise, add success class
+ mcStatus.classList.remove('error-message');
+ mcStatus.classList.add('success-message');
+};
+
+// Submit the form
+var submitMailChimpForm = function (form) {
+
+ // Get the Submit URL
+ var url = form.getAttribute('action');
+ url = url.replace('/post?u=', '/post-json?u=');
+ url += serialize(form) + '&c=displayMailChimpStatus';
+
+ // Create script with url and callback (if specified)
+ var ref = window.document.getElementsByTagName('script')[0];
+ var script = window.document.createElement('script');
+ script.src = url;
+
+ // Create a global variable for the status container
+ window.mcStatus = form.querySelector('.mc-status');
+
+ // Insert script tag into the DOM (append to )
+ ref.parentNode.insertBefore(script, ref);
+
+ // After the script is loaded (and executed), remove it
+ script.onload = function () {
+ this.remove();
+ };
+
+};
+
+// Listen to all blur events
+document.addEventListener('blur', function (event) {
+
+ // Only run if the field is in a form to be validated
+ if (!event.target.form.classList.contains('validate')) return;
+
+ // Validate the field
+ var error = hasError(event.target);
+
+ // If there's an error, show it
+ if (error) {
+ showError(event.target, error);
+ return;
+ }
+
+ // Otherwise, remove any existing error message
+ removeError(event.target);
+
+}, true);
+
+
+// Check all fields on submit
+document.addEventListener('submit', function (event) {
+
+ // Only run on forms flagged for validation
+ if (!event.target.classList.contains('validate')) return;
+
+ // Prevent form from submitting
+ event.preventDefault();
+
+ // Get all of the form elements
+ var fields = event.target.elements;
+
+ // Validate each field
+ // Store the first field with an error to a variable so we can bring it into focus later
+ var error, hasErrors;
+ for (var i = 0; i < fields.length; i++) {
+ error = hasError(fields[i]);
+ if (error) {
+ showError(fields[i], error);
+ if (!hasErrors) {
+ hasErrors = fields[i];
+ }
+ }
+ }
+
+ // If there are errrors, don't submit form and focus on first element with error
+ if (hasErrors) {
+ hasErrors.focus();
+ }
+
+ // Otherwise, let the form submit normally
+ // You could also bolt in an Ajax form submit process here
+ submitMailChimpForm(event.target);
+
+}, false);
\ No newline at end of file
diff --git a/themes/grusp_conf/source/assets/js/menu.js b/themes/grusp_conf/source/assets/js/menu.js
new file mode 100644
index 0000000..35157f8
--- /dev/null
+++ b/themes/grusp_conf/source/assets/js/menu.js
@@ -0,0 +1,25 @@
+document.addEventListener('DOMContentLoaded', () => {
+
+ // Get all "navbar-burger" elements
+ const $navbarBurgers = Array.prototype.slice.call(document.querySelectorAll('.navbar-burger'), 0);
+
+ // Check if there are any navbar burgers
+ if ($navbarBurgers.length > 0) {
+
+ // Add a click event on each of them
+ $navbarBurgers.forEach(el => {
+ el.addEventListener('click', () => {
+
+ // Get the target from the "data-target" attribute
+ const target = el.dataset.target;
+ const $target = document.getElementById(target);
+
+ // Toggle the "is-active" class on both the "navbar-burger" and the "navbar-menu"
+ el.classList.toggle('is-active');
+ $target.classList.toggle('is-active');
+
+ });
+ });
+ }
+
+});
\ No newline at end of file
diff --git a/themes/grusp_conf/source/assets/js/speakers_menu.js b/themes/grusp_conf/source/assets/js/speakers_menu.js
new file mode 100644
index 0000000..87d6239
--- /dev/null
+++ b/themes/grusp_conf/source/assets/js/speakers_menu.js
@@ -0,0 +1,28 @@
+document.addEventListener('DOMContentLoaded', () => {
+ // Get secondary menu button
+ var secondaryMenuButton = document.getElementById('secondary_menu_button');
+ // On click, the seconday menu will be toggled
+ secondaryMenuButton.addEventListener('click', () => {
+ var theMenu = document.getElementById('secondary_menu');
+ if (secondaryMenuButton.classList.contains("is-active")) {
+ theMenu.setAttribute("style", "right: 0");
+ }
+ else {
+ theMenu.setAttribute("style", "right: -14em");
+ }
+ secondaryMenuButton.classList.toggle('is-active');
+ });
+
+ // Get all "secondary-menu-list-item" elements
+ const $secondaryMenuItems = Array.prototype.slice.call(document.querySelectorAll('.secondary-menu-list-item'), 0);
+ if ($secondaryMenuItems.length > 0) {
+ // Add a click event on each of them: on click, the seconday menu will be hidden
+ $secondaryMenuItems.forEach(el => {
+ el.addEventListener('click', () => {
+ var theMenu = document.getElementById('secondary_menu');
+ theMenu.setAttribute("style", "right: -14em");
+ secondaryMenuButton.classList.toggle('is-active');
+ });
+ });
+ }
+});
\ No newline at end of file