Initial commit

This commit is contained in:
Horacio Gonzalez
2020-10-14 14:21:46 +02:00
commit 5a3f6a3161
142 changed files with 17690 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
node_modules

6
404.html Executable file
View File

@@ -0,0 +1,6 @@
<article class="error">
<h1>
This is not the page you were looking for
</h1>
</article>

20
LICENSE Normal file
View File

@@ -0,0 +1,20 @@
The MIT License (MIT)
Copyright (c) 2018 GDGToulouse
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

408
README.md Normal file
View File

@@ -0,0 +1,408 @@
# RdvSpeakers Theme Hugo
RdvSpeakers Theme Hugo, based on [DevFest Theme Hugo](https://github.com/GDGToulouse/devfest-theme-hugo) is a theme for conferences/events.
It's developed for the [Rendez-vous des Speakers](https://rdv-speakers.fr/) conferences & meetups.
See a real usage here: <https://rdv-speakers.fr/>
## Building my conference site from scratch
1. Install [Hugo](https://gohugo.io)
2. Create a new site by running:
```bash
hugo new site my-conf
cd my-conf
mkdir themes
git submodule add https://github.com/RdvSpeakers/rdvspeakers-theme-hugo.git themes/rdvspeakers-theme-hugo
```
3. Then edit your `config.toml` file with
```toml
# ...
theme = "rdvspeakers-theme-hugo"
# ...
```
4. It's done. Just start Hugo server to see it live!
```bash
hugo server
```
## Customizing the site
`yarn` to install the dependency
Run `npm start` to watch Sass changes.
When you are happy with the result run `npm run build` to build the minified version
### Site params
```toml
#...
enableEmoji = true
enableRobotsTXT = true
enableMissingTranslationPlaceholders = true
googleAnalytics = "UA-XXXXXXXX-X"
[params]
title = "La Rentrée des Speakers 2020"
date = "2020-02-28"
description = "*La Rentrée des Speakers*, is a technical conference for developers. It is aimed at students, professionals or simply curious technophiles. Taking into account the health situation, the 2020 edition of *La Rentrée des Speakers* will be online..."
images = ["/images/social-share.jpg"]
email = "rentreespeakers@gmail.com"
keywords = "event, conference, speakers, programming, developers"
copyright = "We ❤️️ speakers"
subscriptionUrl = ""
sponsorshipUrl=""
appleTouchIcon = "/apple-touch-icon.png"
favicon32 = "/favicon-32x32.png"
favicon16 = "/favicon-16x16.png"
manifest = "/manifest.json"
safariPinnedTab = "/safari-pinned-tab.svg"
themeColor = "#673ab7"
env="production"
[params.logos]
jumbo = "/images/logos/logo_color_text.png"
header = "/images/logos/logo_color_text.png"
footer = "/images/logos/logo_gray_text.png"
[languages]
[languages.en]
weight = 1
languageName = "gb"
[languages.fr]
weight = 2
languageName = "fr"
[languages.fr.params]
description = "La Rentrée des Speakers, est une conférence technique destinée aux développeurs et développeuses. Elle s'adresse aussi bien aux étudiant•e•s, aux professionnels ou tout simplement aux curieux et curieuses technophiles. Situation sanitaire oblige, l'édition 2020 de La Rentrée des Speakers 2020 se fera en ligne."
[taxonomies]
tag = "tags"
#...
```
### Header
The top navigation bar is build with
* Site title
* Site parameter `logos.header` for the logo
* Site languages if you need a multilingual site
* Menu `main`
### Footer
The footer is build with
* Site title
* Site params `email`, `subscriptionUrl`, `logos.footer`, `copyright`
* data from `data/footer.yml`
```yml
share:
- name: facebook
url: https://rdv-speakers.fr
- name: twitter
url: https://rdv-speakers.fr
follow:
- name: twitter
url: https://twitter.com/RdvSpeakers
content:
- title: footer_about
links:
- nameKey: footer_coc
url: /code-of-conduct/
newTab: false
```
### Home
The Home page is build with markdown and calling some shortcodes.
#### Jumbo bloc
```hugo
{{% jumbo img="/images/backgrounds/back-0.jpg" imgLabel="Les Rendez-vous des Speakers" %}}
![](/images/logos/logo_color_text.png)
## September 7th-9th, 2020
### Online
{{% /jumbo %}}
```
#### Info block
With main description and key figures.
```hugo
{{% home-info what="Attendees:150,Days:3,Sessions:12" class="primary" %}}
*La Rentrée des Speakers*, is a technical conference for developers.
It is aimed at students, professionals or simply curious technophiles.
Taking into account the health situation, the 2020 edition of *La Rentrée des Speakers* will be online...
{{% /home-info %}}
```
![Info block](images/block-info.png)
#### Feature speakers block
Just present your feature speakers
```hugo
{{% home-speakers %}}
## Featured Speakers
{{< button-link label="Submit a presentation"
url="http://www.conference-hall.io"
icon="cfp" >}}
{{< button-link label="See all speakers"
url="./speakers"
icon="right" >}}
{{% /home-speakers %}}
```
![](images/feature-speakers.png)
#### Subscription block
Call to subscribe
Use the site param `subscriptionUrl`.
```hugo
{{% home-subscribe class="primary" %}}
## Get notified about the important conference updates
{{% /home-subscribe %}}
```
![](images/subscribe.png)
### Ticket block
Display ticket information.
```hugo
{{% home-tickets %}}
# Tickets
<ul>
<li>{{< ticket name="Blind Birds"
starts="2019-04-04"
ends="2019-11-08"
price="40 €"
info="50 first places"
soldOut="true"
url="https://www.billetweb.fr/devfest-toulouse-2019" >}}</li>
<li>{{< ticket name="Early Birds"
starts="2019-04-04"
ends="2019-11-08"
price="60 €"
info="70 first places"
soldOut="true"
url="https://www.billetweb.fr/devfest-toulouse-2019" >}}</li>
<li>{{< ticket name="Normal"
starts="2019-04-04"
ends="2019-11-08"
price="80 €"
info="250 last places"
soldOut=""
url="https://www.billetweb.fr/devfest-toulouse-2019" >}}</li>
</ul>
\* Your ticket gives you access to all conferences, coffee breaks, and lunch. Accommodation is NOT included in this price.
{{% /home-tickets %}}
```
![](images/block-ticket.png)
#### Location block
Show conference location.
```hugo
{{% home-location
image="/images/map.jpg"
address="11 Espl. Compans Caffarelli, 31000 Toulouse"
latitude="43.6110956"
longitude="1.4332799" %}}
## The venue
### Centre de Congrès Pierre Baudis
The Centre de Congrès Pierre Baudis is a modern place of exchange,
located on a privileged location,
in the immediate vicinity of the centre of Toulouse and in a green environment.
{{% /home-location %}}
```
![](images/block-map.png)
### Partners block
Show your partners
```hugo
{{% partners categories="platinium,gold,soutien,media,communautes" %}}
# Partners
{{% /partners %}}
```
![](images/block-partners.png)
#### Album block
```hugo
{{% album images="/images/album/2018/_25A9313.jpg,/images/album/2018/_25A9386.jpg,/images/album/2018/_25A9671.jpg,/images/album/2018/_25A9334.jpg,/images/album/2018/_25A9282.jpg,/images/album/2018/_25A9612.jpg,/images/album/2018/_25A9452.jpg,/images/album/2018/_25A9628.jpg" %}}
### Some pictures of the **DevFest Toulouse 2018** with the 👾 _retro-gaming_ theme.
<a class="btn primary" target="_blank" rel="noopener" href="https://photos.app.goo.gl/nJYFVReFUk9mnXbv9">
See all photos
{{% icon "right" %}}
</a>
{{% /album %}}
```
![](images/block-album.png)
### Partners
A partner should have this params :
```yaml
title: NAME
type: partner
category: soutien
website: 'https://example.com/'
logo: /images/partners/partner.jpg
socials: []
```
### Speakers
A speaker should have this params :
```yaml
id: jane_doe
name: Mme Jane Doe
company: Super Company
featured: false
photo: /images/speakers/jane_doe.jpg
socials:
- icon: twitter
link: 'https://twitter.com/jane_doe'
name: '@jane_doe'
- icon: github
link: 'https://github.com/jane_doe'
name: jane_doe
shortBio: "Short bio"
companyLogo: /images/speakers/company/company.jpg
country: 'City, Country'
```
The body of the file is used as long bio.
### Sessions
<!> this is not yet stable
A sessions should have this params :
```yaml
id: an_id
title: Super mega title
language: Français
complexity: Beginner
tags:
- Category
presentation: URL of slides
videoId: Youtub video id
speakers:
- speaker id
talkType: Keynote
```
The body of the file is used as description.
### Team
A team member should have these params:
```yaml
title: Name
type: core
subtitle: ''
photo: photo.jpg
socials:
- link: 'https://twitter.com/XXX'
name: Twitter
- link: 'https://www.linkedin.com/XXX'
name: LinkedIn
```
### Blog
A blog should have these params:
```yaml
title: Title
brief: Short brief
image: /images/blog/photo.jpeg
date: 2019-01-20
draft: false
```
And of course, the body is the blog post.
### TODO Schedule
Development scheduled to summer 2019.
### FAQ, Code of Conduct, ...
just classique markdown file, this the `menu.main.weight: 80` to be displayed into the navbar.
### Notes
* We focus on English and French in this theme, so with other language, you should add months into the `layouts/partials/date-short.html`
## License
MIT, see [LICENSE](https://github.com/jweslley/hugo-conference/blob/master/LICENSE).

9
archetypes/blog.md Normal file
View File

@@ -0,0 +1,9 @@
---
title: "{{ replace .TranslationBaseName "-" " " | title }}"
date: {{ .Date }}
image: "a header image"
brief: "A short brief"
draft: true
---
TODO

6
archetypes/default.md Normal file
View File

@@ -0,0 +1,6 @@
---
title: "{{ replace .TranslationBaseName "-" " " | title }}"
---
{{< hero >}}
{{< /hero >}}

15
archetypes/partners.md Normal file
View File

@@ -0,0 +1,15 @@
---
title: "{{ replace .TranslationBaseName "-" " " | title }}"
date: {{ .Date }}
type: partner
category: platinium
website: 'https://www.airbus.com/'
logo: /images/partners/logo-airbus.png
socials:
- name: twitter
url: 'https://twitter.com/airbus'
- name: linkedin
url: 'https://www.linkedin.com/in/airbus'
---
TODO Description

15
archetypes/sessions.md Normal file
View File

@@ -0,0 +1,15 @@
---
id: XXX
title: lorem ipsum
language: Français
complexity: Débutant
talkType: Conférence
speakers:
- guillaume_membre
tags:
- IOT
presentation: http://slideshare.....
videoId: Youtube Id
---
Full description

17
archetypes/speakers.md Normal file
View File

@@ -0,0 +1,17 @@
---
id: "{{ .TranslationBaseName | title }}"
name: "{{ replace .TranslationBaseName "-" " " | title }}"
company: XXX Corp
featured: false
photo: /images/speakers/alexandre_delattre.jpg
socials:
- icon: twitter
link: 'https://twitter.com/XXX'
name: '@XXX'
shortBio: lorem ipsum ...
companyLogo: /images/speakers/company/YYY.jpg
country: 'Toulouse, France'
---
Full bio

14
archetypes/team.md Normal file
View File

@@ -0,0 +1,14 @@
---
title: XXX
type: core
subtitle: XXX
photo: /images/people/kevin_davin.png
socials:
- link: 'https://twitter.com/XXX'
name: Twitter
- link: 'https://github.com/XXX'
name: Github
- link: www.linkedin.com/in/XXX
name: LinkedIn
---

75
i18n/en.toml Normal file
View File

@@ -0,0 +1,75 @@
##########
# Header #
##########
[language_switch]
other = "Basculer en"
########
# Home #
########
[home_tickets_action]
other = "Buy Ticket"
[home_tickets_soldout]
other = "Sold Out"
[home_tickets_close]
other = "Not available"
[home_location_direction]
other = "Direction"
##########
# Footer #
##########
[footer_share]
other = "Share"
[facebook_share_label]
other = "Share on Facebook"
[twitter_share_text]
other = "Come join us at @RentreeSpeakers the after-summer virtual conference for French-speaking Software Developers"
[twitter_share_label]
other = "Share on Twitter"
[footer_follow_blog]
other = "Follow our"
[footer_follow_blog_blog]
other = "blog"
[footer_follow_us]
other = "Follow us"
[footer_about]
other = "About"
[footer_previous_edition]
other = "Previous edition"
[footer_become_partners]
other = "Become partner"
[footer_become_partners_label]
other = "Partnership Proposition"
[footer_coc]
other = "Code of Conduct"
################
# Subscription #
################
[newsletter]
other = "Newsletter"
[subscribe_notice]
other = "No spam, only the latest news and updates!"
[subscribe_action]
other = "Subscribe"

74
i18n/fr.toml Normal file
View File

@@ -0,0 +1,74 @@
##########
# Header #
##########
[language_switch]
other = "Switch to"
########
# Home #
########
[home_tickets_action]
other = "Billeterie"
[home_tickets_soldout]
other = "Rupture de stock"
[home_tickets_close]
other = "Non disponible"
[home_location_direction]
other = "Itinéraire"
##########
# Footer #
##########
[footer_share]
other = "Partager"
[facebook_share_label]
other = "Partager sur Facebook"
[twitter_share_text]
other = "Venez à la @RentreeSpeakers, la conférence dev incontournable de la rentrée !"
[twitter_share_label]
other = "Partager sur Twitter"
[footer_follow_blog]
other = "Suivez notre"
[footer_follow_blog_blog]
other = "blog"
[footer_follow_us]
other = "Suivez nous sur"
[footer_about]
other = "A propos"
[footer_previous_edition]
other = "Précédente édition"
[footer_become_partners]
other = "Devenir partenaire"
[footer_become_partners_label]
other = "Proposition de partenariat"
[footer_coc]
other = "Code de conduite"
################
# Subscription #
################
[newsletter]
other = "Newsletter"
[subscribe_notice]
other = "Pas de spam, juste les dernières infos !"
[subscribe_action]
other = "Souscrire"

30
icons.js Normal file
View File

@@ -0,0 +1,30 @@
const {readFileSync, writeFileSync} = require('fs');
const {sync: glob} = require('glob');
const {Logger, LogLevel, colorEmojiConfig} = require('plop-logger');
// const {colorEmojiConfig} = require('plop-logger/dist/extra/colorEmojiConfig');
Logger.config = colorEmojiConfig;
const logger = Logger.getLogger('icons');
logger.level = LogLevel.All;
let svgFiles = `src/icons/*.svg`;
logger.info('SVG aggregation of', svgFiles);
const data = glob(svgFiles)
.map(file => {
const parts = file.split('/');
const id = parts[parts.length - 1].split('.')[0];
logger.debug('handle', id);
return readFileSync(file, 'utf8')
.replace(`<svg xmlns="http://www.w3.org/2000/svg"`, `\t<symbol id="${id}"`)
.replace(`</svg>`, `\t</symbol>`);
}
);
const svg = `<svg xmlns="http://www.w3.org/2000/svg" width="0" height="0" class="visually-hidden">
${data.join('\n')}
</svg>`;
const file = 'static/icons.svg';
logger.info('Generate', file);
writeFileSync(file, svg, {flag: 'w'});

BIN
images/block-album.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

BIN
images/block-info.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

BIN
images/block-map.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 392 KiB

BIN
images/block-partners.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
images/block-ticket.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

BIN
images/feature-speakers.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

BIN
images/screenshot.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

BIN
images/subscribe.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

BIN
images/tn.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 638 KiB

3
layouts/404.html Normal file
View File

@@ -0,0 +1,3 @@
{{ define "main"}}
<h1 class="error">Oops!, page {{ .Permalink }} not found !</h1>
{{ end }}

View File

@@ -0,0 +1,29 @@
<!DOCTYPE html>
<html lang="{{ $.Site.LanguageCode | default " en" }}">
{{ partial "head.html" . }}
<body class="{{ .Kind }} {{ anchorize .URL }} {{ .Section }}">
{{ readFile "themes/devfest-theme-hugo/static/icons.svg" | safeHTML }}
{{ block "header" . }}
{{ partial "header.html" . }}
{{ end }}
<main>
{{ block "main" . }}
<!-- Missing main block -->
{{ end }}
</main>
{{ block "footer.html" . }}
{{ partial "footer.html" . }}
{{ end }}
<script src="/theme.js" async></script>
{{ block "scripts" . }}
<!-- No extra scripts -->
{{ end }}
</body>
</html>

View File

@@ -0,0 +1,15 @@
{{ define "main" }}
{{ .Content }}
<hr>
<ul class="pages">
{{ range .Pages }}
<li>
<a href="{{ .URL }}"> {{ .Title }}</a>
</li>
{{ end }}
</ul>
{{ end }}

View File

@@ -0,0 +1,14 @@
{{ define "main" }}
<div class="hero">
<h1>{{ .Title }}</h1>
<div class="description">
{{ .TableOfContents }}
</div>
</div>
<section class="content">
{{ .Content }}
</section>
{{ end }}

31
layouts/blog/list.html Normal file
View File

@@ -0,0 +1,31 @@
{{ define "main" }}
{{ $lang := $.Page.Language.Lang }}
<div class="hero">
<h1>{{ $.Page.Params.Title }}</h1>
<div class="description">
{{ .Content }}
</div>
</div>
<section class="blogs">
{{ range .Pages }}
<article>
<a class="visually-hidden" aria-hidden="true" href="{{ .Permalink }}">{{ .Title }}</a>
<a class="blog" href="{{ .Permalink }}">
<div class="img" style="background-image: url({{ .Params.image }});"></div>
<div class="info">
<div class="date">{{ partial "date-short.html" (dict "time" .Date "lang" $lang) }}</div>
<h2>{{ .Title }}</h2>
<span class="brief">{{ .Params.brief }}</span>
<!-- <div class="reading">{{ .ReadingTime }}</div> -->
<p>{{ .Summary }} ...</p>
</div>
</a>
</article>
{{ end }}
</section>
{{ end }}

22
layouts/blog/single.html Normal file
View File

@@ -0,0 +1,22 @@
{{ define "main" }}
<div class="hero" >
<div class="img" style="color: {{ .Params.color | default "#fff" }};background-image: url({{ .Params.image }})"></div>
<div class="description">
<h1>
<span>{{ .Title }}</span>
<small>{{ .Params.brief }}</small>
</h1>
<!--
<hr>
{{ .TableOfContents }} -->
</div>
</div>
<section class="content">
{{ .Content }}
</section>
{{ end }}

6
layouts/index.html Normal file
View File

@@ -0,0 +1,6 @@
{{ define "main" }}
{{ .Content }}
{{ end }}

View File

@@ -0,0 +1,5 @@
{{- $monthFr := (slice "janvier" "février" "march" "avril" "mai" "juin" "juillet" "août" "septembre" "octobre" "novembre" "décembre")}}
{{- $time := time (index . "time") }}
{{- $lang := index . "lang" }}
{{ $time.Day }}
{{ if eq $lang "fr" }}{{ index $monthFr (sub $time.Month 1) }}{{- else }} {{ dateFormat "January" $time}}{{ end }}

View File

@@ -0,0 +1,13 @@
{{ $monthFr := (slice "jan." "fév." "mar." "avr." "mai" "juin" "juil." "aoû." "sep." "oct." "nov." "déc.")}}
{{ $time := time (index . "time") }}
{{ $lang := index . "lang" }}
{{ $time.Day }}
{{ if eq $lang "fr" }}
{{ index $monthFr (sub $time.Month 1)}}
{{ else }}
{{ dateFormat "Jan." $time}}
{{ end }}
{{ $time.Year }}

View File

@@ -0,0 +1,87 @@
<footer>
<div class="bottom-content">
<div class="footer-header">
<div class="share">
<header>{{ i18n "footer_share" }}</header>
<ul class="social-list">
{{ range .Site.Data.footer.share }}
<li>
{{ $url := .url | relLangURL }}
{{ partial "social-sharer.html" (dict "context" . "url" .url "name" .name) }}
{{ end }}
</ul>
</div>
<div class="blog">
<header>
{{ i18n "footer_follow_blog" }} <a href="{{ "blog/" | relLangURL }}">{{ i18n "footer_follow_blog_blog" }}</a>
</header>
</div>
<div class="follow">
<header>{{ i18n "footer_follow_us" }}</header>
<ul class="social-list">
{{ range .Site.Data.footer.follow }}
<li>
<a href="{{ .url }}" class="social" rel="noreferrer" target="_blank">
{{ partial "icon.html" .name }}
{{ .name }}
</a>
</li>
{{ end }}
</ul>
</div>
<div class="email">
<a href="mailto:{{ .Site.Params.email }}">
{{ partial "icon.html" "email" }}
{{- .Site.Params.email -}}
</a>
</div>
</div>
<hr>
<div class="footer-content">
{{ range .Site.Data.footer.content }}
<section>
<header>{{ i18n .title }}</header>
{{ if .links }}
<ul>
{{ range .links }}
<li>
<a href="{{ .url }}" {{ if .newTab }}target="_blank" rel="noopener" {{end}}>
{{ if .nameKey }}
{{ i18n .nameKey }}
{{ else }}
{{ .name }}
{{ end }}
</a>
</li>
{{ end }}
</ul>
{{ end }}
</section>
{{ end }}
{{ if .Site.Params.subscriptionUrl }}
<section class="subscribe">
<header>{{ i18n "newsletter" }}</header>
<p>{{ i18n "subscribe_notice" }}</p>
<a href="{{ .Site.Params.subscriptionUrl }}"
class="btn" rel="noreferrer" target="_blank">
{{ partial "icon.html" "subscribe" }}
{{- i18n "subscribe_action" -}}
</a>
</section>
{{ end }}
</div>
<hr>
<div class="footer-footer">
{{ if .Site.Params.logos.footer }}
<img src="{{ .Site.Params.logos.footer }}" alt="{{ .Site.Title }}">
{{ end }}
<div>{{ emojify .Site.Params.copyright }}</div>
</div>
</div>
</footer>

View File

@@ -0,0 +1,53 @@
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
<meta name="HandheldFriendly" content="True">
<meta name="MobileOptimized" content="320">
<meta name="Description" content="{{ .Site.Params.description }}">
{{ if eq (getenv "HUGO_ENV") "production" | or (eq .Site.Params.env "production") }}
{{/* NOTE: These Hugo Internal Templates can be found starting at
https://github.com/gohugoio/hugo/tree/master/tpl/tplimpl/embedded/templates */}}
{{- template "_internal/opengraph.html" . -}}
{{- template "_internal/google_news.html" . -}}
{{- template "_internal/schema.html" . -}}
{{- template "_internal/twitter_cards.html" . -}}
{{ template "_internal/google_analytics_async.html" . }}
{{ end }}
{{ hugo.Generator }}
<META NAME="ROBOTS" CONTENT="INDEX, FOLLOW">
<title>{{ block "title" . }}{{ .Site.Title }} {{ with .Params.Title }} | {{ . }}{{ end }}{{ end }}</title>
{{ if .Site.Params.appleTouchIcon }}
<link rel="apple-touch-icon" sizes="180x180" href="{{ .Site.Params.appleTouchIcon }}">
{{ end }}
{{ if .Site.Params.favicon32 }}
<link rel="icon" type="image/png" sizes="32x32" href="{{ .Site.Params.favicon32 }}">
{{ end }}
{{ if .Site.Params.favicon16 }}
<link rel="icon" type="image/png" sizes="16x16" href="{{ .Site.Params.favicon16 }}">
{{ end }}
{{ if .Site.Params.manifest }}
<link rel="manifest" href="{{ .Site.Params.manifest }}">
{{ end }}
{{ if .Site.Params.themeColor }}
<meta name="theme-color" content="{{ .Site.Params.themeColor }}"/>
<meta name="msapplication-TileColor" content="#{{ .Site.Params.themeColor }}">
{{ if .Site.Params.safariPinnedTab }}
<link rel="mask-icon" href="{{ .Site.Params.safariPinnedTab }}" color="{{ .Site.Params.themeColor }}">
{{ end }}
{{ end }}
<link href="{{ with .OutputFormats.Get "RSS" }}{{ .RelPermalink }}{{ end }}" rel="alternate" type="application/rss+xml" title="{{ .Site.Title }}"/>
<link href="{{ with .OutputFormats.Get "RSS" }}{{ .RelPermalink }}{{ end }}" rel="feed" type="application/rss+xml" title="{{ .Site.Title }}"/>
<link href="https://fonts.googleapis.com/css?family=Roboto:400,500,700" rel="stylesheet">
<link rel="stylesheet" href="/theme.css" media="all">
{{ block "headextra" . }}
<!-- No extra headextra -->
{{ end }}
</head>

View File

@@ -0,0 +1,54 @@
<header>
<div class="top-content">
<div class="logo">
<a href="{{"/" | relLangURL}}">
<img src="{{ .Site.Params.logos.header }}" alt="logo {{ .Site.Title }}">
</a>
</div>
<input type="checkbox" id="menu-burger" class="visually-hidden" aria-label="Menu"/>
<label for="menu-burger">
{{ partial "icon.html" "menu" }}
{{ partial "icon.html" "close" }}
</label>
<nav>
<ul class="menu">
{{- $currentPage := . -}}
{{ range .Site.Menus.main }}
<li class="{{ if $currentPage.IsMenuCurrent "main" . }}active{{ end }}" >
{{ if (hasPrefix .URL "http") }}
<a class="external" rel="noreferrer" target="_blank" href="{{ .URL }}" title="{{ .Name }}">{{ .Name }}</a>
{{ else if (strings.HasSuffix .URL "pdf")}}
<a href="{{ .URL | relLangURL }}">{{ .Name }}</a>
{{ else if (isset .Page.Params "icon") }}
<a href="{{ .URL | relLangURL }}" class="link-icon" title="{{ .Name }}">
{{ partial "icon.html" .Page.Params.icon }}
</a>
{{ else }}
<a href="{{ .URL | relLangURL }}">{{ .Name }}</a>
{{ end }}
</li>
{{ end }}
</ul>
<ul class="languages">
{{ range .Translations }}
<li>
<a class="lang lang-{{ .Language.LanguageName }} {{ if eq .Language $.Site.Home.Language }}active{{ end }}"
title="{{ .Language.LanguageName }}"
href="{{ .RelPermalink }}"
role="radio"
aria-label="{{ i18n "language_switch" }} {{ .Language.LanguageName }}"
aria-checked="{{ if eq .Language $.Site.Home.Language }}true{{ else }}false{{ end }}">
{{- i18n "language_switch" }} {{ .Language.LanguageName -}}
</a>
</li>
{{ end }}
</ul>
</nav>
</div>
</header>

View File

@@ -0,0 +1,3 @@
<svg class="icon icon-{{ . }}">
<use xlink:href="#{{ . }}"/>
</svg>

After

Width:  |  Height:  |  Size: 68 B

View File

@@ -0,0 +1,4 @@
<a class="partner"
href="{{ .URL }}"
title="{{ .Title }}"
style="background-image: url({{ .Params.logo }});">{{ .Title }}</a>

View File

@@ -0,0 +1,50 @@
<a href="{{ .Permalink }}">
<h4 title="{{ .Title }}">
{{ .Title }}
<span class="language {{ anchorize .Params.language }}"></span>
</h4>
<hr>
<div class="info">
{{ if .Params.tags }}
<div class="tags">
{{ range .Params.tags }}
{{ range first 1 (where $.Site.Data.categories "key" .) }}
<span>{{ .name }}</span>
{{ end }}
{{ end }}
</div>
{{ end }}
{{ if .Params.level }}
<div class="complexity" title="{{ .Params.level }}">
<svg><use xlink:href="#level-{{ .Params.level }}"></use></svg>
</div>
{{ end }}
{{ if .Params.presentation }}
<div class="presentation">{{ partial "icon.html" "slides" }}</div>
{{ end }}
{{ if .Params.videoId }}
<div class="video">{{ partial "icon.html" "youtube" }}</div>
{{ end }}
</div>
{{ if .Params.speakers }}
<ul class="speakers {{ if eq 1 (len .Params.speakers) }}single{{ else }}multi{{ end }}">
{{ range where $.Site.RegularPages "Params.key" "in" .Params.speakers }}
<li class="speaker">
<div class="speaker-img" style="background-image: url({{ .Params.photoURL }});"></div>
<strong class="speaker-name">{{ .Params.name }}</strong>
<!-- <div class="speaker-company">{{ .Params.company }}</div>-->
</li>
{{ end }}
</ul>
{{ end }}
</a>

View File

@@ -0,0 +1,49 @@
<a href="{{ .URL }}">
<h2>
{{ .Title }}
<span class="language {{ anchorize .Params.language }}"></span>
</h2>
<hr>
<div class="info">
{{ if.Params.tags }}
<div class="tags">
{{ range .Params.tags }}
{{ range first 1 (where $.Site.Data.categories "key" .) }}
<span>{{ .name }}</span>
{{ end }}
{{ end }}
</div>
{{ end }}
<div class="complexity">{{ .Params.level }}</div>
<div class="type type-{{ anchorize .Params.format }}">
{{ index ( index (where .Site.Data.formats "key" .Params.format) 0 ) "name" }}
</div>
<div>
{{ if .Params.presentation }}
<div class="presentation">{{ partial "icon.html" "slides" }}</div>
{{ end }}
{{ if .Params.videoId }}
<div class="video">{{ partial "icon.html" "youtube" }}</div>
{{ end }}
</div>
</div>
<ul class="speakers">
{{ range where .Site.RegularPages "Params.key" "in" .Params.speakers }}
<li class="speaker">
<div class="speaker-img" style="background-image: url({{ .Params.photoURL }});"></div>
<strong class="speaker-name">{{ .Params.name }}</strong>
<span class="speaker-country">{{ .Params.country }}</span>
<div class="speaker-company">{{ .Params.company }}</div>
</li>
{{ end }}
</ul>
</a>

View File

@@ -0,0 +1,14 @@
{{- if (eq .name "facebook") -}}
<a href="https://www.facebook.com/sharer.php?u={{ .url }}"
class="social" rel="noreferrer" target="_blank">
{{ partial "icon.html" .name }}
{{- i18n "facebook_share_label" -}}
</a>
{{- else if (eq .name "twitter") -}}
{{ $text := i18n "twitter_share_text" }}
<a href="https://twitter.com/share?url={{ .url }}&text={{ $text }}"
class="social" rel="noreferrer" target="_blank">
{{ partial "icon.html" .name }}
{{- i18n "twitter_share_label" -}}
</a>
{{- end -}}

View File

@@ -0,0 +1,9 @@
<a class="visually-hidden" href="{{ .URL }}">{{ .Params.name }}</a>
<a class="speaker" href="{{ .URL }}">
<div role="presentation" class="speaker-img" style="background-image: url({{ .Params.photoURL }});"></div>
<div class="info">
<div class="speaker-company">{{ .Params.company }}</div>
<strong class="speaker-name">{{ .Params.name }}</strong>
<span class="speaker-country">{{ .Params.city }}</span>
</div>
</a>

View File

@@ -0,0 +1,15 @@
<div class="photo" role="presentation" style="background-image: url('{{ relURL (path.Join "images" "team" .Params.photo) }}');"></div>
<div class="label">
<h3>{{ .Title }}</h3>
<h4>{{ .Params.subtitle }}</h4>
<ul class="socials">
{{ range .Params.socials }}
<li>
<a class="social" rel="noreferrer" href="{{ .link }}" target="_blank">
{{ partial "icon.html" (lower .name) }}
{{- .name -}}
</a>
</li>
{{ end }}
</ul>
</div>

View File

@@ -0,0 +1,15 @@
<div class="ticket" {{ if .soldOut }}aria-disabled="true"{{end}}>
<div class="ticket-name">{{ .name }}</div>
<div class="ticket-price">{{ .price }} {{ .currency }}</div>
<div class="ticket-date">{{ .starts }} - {{ .ends }}</div>
<div class="ticket-info">{{ .info }}</div>
{{ if .soldOut }}
<span class="btn" aria-disabled="true">{{ i18n "home_tickets_soldout" }}</span>
{{ else }}
<a href="{{ .url }}" class="btn primary" rel="noreferrer" target="_blank">
{{ partial "icon.html" "ticket" }}
{{- i18n "home_tickets_action" -}}
</a>
{{ end }}
</div>

View File

@@ -0,0 +1,5 @@
{{ define "main" }}
{{ .Content }}
{{ end }}

View File

@@ -0,0 +1,63 @@
{{ define "main" }}
<section class="header">
<div class="card" style="background-image: url({{ .Params.logo }});"></div>
<h1>{{ .Title }}</h1>
{{ if .Params.website }}
<a href="{{ .Params.website }}">{{ .Params.website }}</a>
{{ end }}
</section>
<section class="content">
{{ .Content }}
</section>
{{ if .Params.why }}
<section class="why">
<h2>{{index .Site.Data.partner .Params.lang "why" }}</h2>
<p>{{ .Params.why }}</p>
</section>
{{ end }}
{{ if .Params.socials }}
<section class="socials">
<h2>Social media</h2>
<ul>
{{ range .Page.Params.socials }}
<li>
<a href="{{ .link }}" class="social" rel="noreferrer" target="_blank">
{{ partial "icon.html" (lower .name) }}
{{ .name }}
</a>
</li>
{{ end }}
</ul>
</section>
{{ end }}
{{ if .Params.jobs }}
<section class="jobs">
<h2>{{index .Site.Data.partner .Params.lang "jobs" }}</h2>
<ul>
{{ range .Page.Params.jobs }}
<li class="job">
<header>
<a href="{{ .url }}" rel="noreferrer" target="_blank">{{ .title }}</a>
</header>
<div class="city">
{{ partial "icon.html" "map-marker" }}
{{ .city }}
</div>
<a href="mailto:{{ .contact }}" class="contact">
{{ partial "icon.html" "email" }}
{{ .contact }}
</a>
</li>
{{ end }}
</ul>
</section>
{{ end }}
{{ end }}

111
layouts/schedule/list.html Normal file
View File

@@ -0,0 +1,111 @@
{{ define "main" }}
{{ .Content }}
{{ $lang := $.Page.Language.Lang }}
<nav class="day-tabs">
{{ range $day := $.Site.Data.schedule }}
<a href="#day_{{$day.day}}">{{- partial "date-long.html" (dict "time" .day "lang" $lang) }}</a>
{{ end }}
</nav>
{{ $.Scratch.Set "maxEnd" 0 }}
{{ range $.Site.Data.slots }}
{{ if gt .row.end ($.Scratch.Get "maxEnd") }}
{{ $.Scratch.Set "maxEnd" .row.end }}
{{ end}}
{{ end }}
{{ $maxEnd := $.Scratch.Get "maxEnd" }}
<section class="schedule{{ if $.Params.horizontal}} horizontal{{ end }}">
{{ range $day := $.Site.Data.schedule }}
{{ $time := split $day.start ":" }}
{{ $dayStartH := index $time 0 }}
{{ $dayStartM := index $time 1 }}
{{ $time := split $day.end ":" }}
{{ $dayEndH := index $time 0 }}
{{ $dayEndM := index $time 1 }}
<article id="day_{{$day.day}}" class="day"
style="--rooms: {{ len .rooms }}; --end: {{ $maxEnd }};">
<h2>{{- partial "date-long.html" (dict "time" .day "lang" $lang) }}</h2>
{{ with (index .rooms 0) }}
{{ range .slots }}
{{ $slot := index (where $.Site.Data.slots "key" .slot) 0 }}
{{ $time := split $slot.start ":" }}
{{ $hh := index $time 0 }}
{{ $mm := index $time 1 }}
<div class="slot" style="--duration: {{ $slot.duration }}; --row-start: {{ $slot.row.start }}; --row-end: {{ $slot.row.end }};">
<span class="hh">{{ $hh }}</span>
<span class="mm">{{ $mm }}</span>
</div>
{{ end }}
{{ end }}
{{ range $index, $room := .rooms }}
{{ range where (where $.Site.Data.rooms "key" $room.room) "skip" "!=" true }}
<!-- Room {{ $room.room }} -->
<div class="room {{ if (modBool $index 2)}}even{{end}}" style="--room: {{ $index }};">
<h3>
{{ .label }}
{{ if .description }}
<small>{{ .description }}</small>
{{ end }}
</h3>
</div>
{{ range $room.slots }}
{{ $sessionPage := index (where $.Site.AllPages "Params.key" .talk ) 0}}
{{ $slot := index (where $.Site.Data.slots "key" .slot) 0 }}
{{ $time := split $slot.start ":" }}
{{ $hh := index $time 0 }}
{{ $mm := index $time 1 }}
<div class="session format-{{$sessionPage.Params.format}} tag-{{ anchorize (delimit ($sessionPage.Params.tags | default (slice)) " " ) }}"
style="--room: {{ $index }}; --row-start: {{ $slot.row.start }}; --row-end: {{ $slot.row.end }};">
<span class="start">
<span class="hh">{{ $hh }}</span>
<span class="mm">{{ $mm }}</span>
</span>
{{ partial "schedule-session" $sessionPage }}
</div>
{{ end }}
<!-- End room {{ $room.room }} -->
{{ end }}
{{ end }}
</article>
{{ end }}
</section>
<!--<a href="#" class="goto-top" aria-label="Top">⬆︎</a>-->
{{ end }}
{{ define "scripts" }}
<script>
function checkLinks() {
const currentDay = document.location.hash;
if (!currentDay) {
let firstDay = document.querySelector('nav.day-tabs a');
if (firstDay) {
firstDay.click();
}
}
document.querySelectorAll('nav.day-tabs a')
.forEach(function(lnk) {
lnk.classList.toggle('active', lnk.getAttribute('href') === currentDay);
});
}
window.addEventListener("load", checkLinks, false);
window.addEventListener("hashchange", checkLinks, false);
</script>
{{ end }}

View File

@@ -0,0 +1,32 @@
{{ define "main" }}
{{ .Content }}
<section>
{{ $sessions := where $.Site.AllPages ".Section" "sessions" }}
{{ $types := apply $.Site.Data.formats "index" "." "key" }}
{{ range slice "1" "2" "3" }}
{{ $day := where $sessions ".Params.day" ( int . ) }}
<h2>{{ index $.Site.Params.days . }}</h2>
<ul class="talks">
{{ range sort $day ".Params.key" }}
{{ if intersect (slice .Params.format) $types }}
<li class="talk tag-{{ anchorize (delimit (.Params.tags | default (slice)) "" ) }}">{{ partial "session.html" . }}</li>
{{ end }}
{{ end }}
</ul>
<p></p>
{{ end }}
</ul>
</section>
{{ end }}

View File

@@ -0,0 +1,63 @@
{{ define "main" }}
<section class="talk">
<header class="tag-{{ anchorize (delimit (.Params.tags | default (slice)) "" ) }}">
<div class="tags">
{{ range .Params.tags }}
{{ range first 1 (where $.Site.Data.categories "key" .) }}
<span>{{ .name }}</span>
{{ end }}
{{ end }}
</div>
<h1 class="text">{{ .Title }}</h1>
<span class="language {{ anchorize .Params.language }}"></span>
</header>
<div class="info">
<div class="complexity">{{ .Params.level }}</div>
<div class="type type-{{ anchorize .Params.format }}">{{ .Params.format }}</div>
<div class="detail">
<ul class="speakers">
{{ range where .Site.RegularPages "Params.key" "in" .Params.speakers }}
<li>
<a class="visually-hidden" aria-hidden="true" href="/speakers/{{ .Params.key }}">{{ .Params.name }}</a>
<a class="speaker" href="/speakers/{{ .Params.key }}">
<div class="speaker-img" style="background-image: url({{ .Params.photoURL }});"></div>
<strong class="speaker-name">{{ .Params.name }}</strong>
<span class="speaker-country">{{ .Params.city }}</span>
<div class="speaker-company">{{ .Params.company }}</div>
</a>
</li>
{{ end }}
</ul>
<div class="content">{{ .Content }}</div>
</div>
</div>
<div class="media">
{{ if .Params.videoId }}
<div class="video" style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
<iframe src="//www.youtube.com/embed/{{ .Params.videoId }}?autoplay=1"
style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen
title="YouTube Video"></iframe>
</div>
{{ end }}
{{ if .Params.presentation }}
<a class="social-slides"
href="{{ .Params.presentation }}"
rel="noreferrer"
target="_blank">
{{ partial "icon.html" "slides" }}
Voir les slides
</a>
{{ end }}
</div>
</section>
{{ end }}

View File

@@ -0,0 +1,8 @@
{{ $_hugo_config := `{ "version": 1 }` }}
<div class="album">
{{ range (split (.Get "images") ",") }}
<div class="img" style="background-image: url('{{ . }}');"></div>
{{ end }}
<div class="inner">{{ .Inner }}</div>
</div>

View File

@@ -0,0 +1,11 @@
{{ $_hugo_config := `{ "version": 1 }` }}
{{ $icon := .Get "icon" }}
{{ $url := .Get "url" }}
{{ $label := .Get "label" }}
<a class="btn primary" href="{{ $url }}">
{{ if and $icon (not (eq $icon "right")) }}{{ partial "icon.html" $icon }}{{ end }}
{{- $label -}}
{{ if eq $icon "right" }}{{ partial "icon.html" $icon }}{{ end }}
</a>

View File

@@ -0,0 +1,6 @@
<div class="centered-img">
<img
src="{{.Get "src" }}"
alt="{{.Get "alt" | default "" }}"
width="{{.Get "width" | default "auto" }}">
</div>

View File

@@ -0,0 +1,7 @@
{{ $_hugo_config := `{ "version": 1 }` }}
<div class="hero">
<h1>{{ $.Page.Title }}</h1>
<div class="description">
{{ .Inner }}
</div>
</div>

View File

@@ -0,0 +1,22 @@
{{ $_hugo_config := `{ "version": 1 }` }}
<section class="info container {{ .Get "class" }}">
<div class="wrapper">
<div class="inner">
{{ .Inner }}
</div>
{{ with .Get "what" }}
<div class="numbers">
{{range (split . ",") }}
<div class="number">
{{ $labelValue := (split . ":") }}
{{ $label := (index $labelValue 0) }}
{{ $value := (index $labelValue 1) }}
<strong>{{ $value }}</strong>
<div>{{ $label }}</div>
</div>
{{ end }}
</div>
{{ end }}
</div>
</section>

View File

@@ -0,0 +1,23 @@
{{ $_hugo_config := `{ "version": 1 }` }}
<section class="location">
<div class="map" style="background-image: url('{{ .Get "image" }}');"></div>
<div class="description">
<div class="inner">
{{ .Inner }}
</div>
<div class="direction">
{{ .Get "address" }}
<a href="https://www.google.com/maps/dir/?api=1&destination={{ .Get "latitude" }},{{ .Get "longitude" }}"
class="btn btn-icon-only" target="_blank" rel="noreferrer"
aria-label="{{ i18n "home_location_direction" }}">
{{ partial "icon.html" "direction" }}
</a>
</div>
</div>
</section>

View File

@@ -0,0 +1,16 @@
{{ $_hugo_config := `{ "version": 1 }` }}
<section class="speakers">
<div class="inner">
{{ .Inner }}
</div>
<ul class="shuffle">
{{ range where $.Site.AllPages "Params.feature" true }}
<li>
{{ partial "speaker.html" . }}
</li>
{{ end }}
</ul>
</section>

View File

@@ -0,0 +1,9 @@
{{ $_hugo_config := `{ "version": 1 }` }}
<section class="subscribe {{ .Get "class" }}">
<div class="inner">{{ .Inner }}</div>
<a href="{{ .Site.Params.subscriptionUrl }}"
class="btn primary" rel="noreferrer" target="_blank">
{{ partial "icon.html" "subscribe" }}
{{ i18n "subscribe_action" }}
</a>
</section>

View File

@@ -0,0 +1,4 @@
{{ $_hugo_config := `{ "version": 1 }` }}
<section class="tickets">
{{ .Inner }}
</section>

View File

@@ -0,0 +1,3 @@
<svg class="icon icon-{{ .Get 0 }}">
<use xlink:href="#{{ .Get 0 }}"/>
</svg>

After

Width:  |  Height:  |  Size: 78 B

View File

@@ -0,0 +1,19 @@
{{ $_hugo_config := `{ "version": 1 }` }}
{{ $imgLabel := .Get "imgLabel" }}
{{ $logo := .Site.Params.logos.jumbo }}
<div class="jumbo">
<div class="jumbo-cover" style="background-image: url('{{ .Get "img" }}')" {{ if $imgLabel }}aria-label="{{ $imgLabel }}"{{ end }}></div>
<img id="jumbo-img" src="{{ .Get "img" }}" />
<div id="jumbo-overlay"></div>
<div class="inner-wrapper">
{{ if $logo }}
<img class="jumbo-logo" src="{{ $logo }}" alt="logo {{ .Site.Title }}">
{{ end }}
<div class="inner">
{{ .Inner }}
</div>
</div>
<div class="scroll-down" aria-hidden="true">
{{ partial "icon.html" "scroll-down" }}
</div>
</div>

View File

@@ -0,0 +1,21 @@
{{ $_hugo_config := `{ "version": 1 }` }}
<section class="partners">
<div class="inner">
{{ .Inner }}
</div>
{{ $site := .Site }}
{{ range (split (.Get "categories") ",") }}
<section class="partners-group partner-{{ . }}">
<h3 class="fancy">
<span>{{ index $.Site.Params.partnerCategories . }}</span>
</h3>
<ul>
{{ $partners := where $site.AllPages "Params.category" . }}
{{ range sort $partners ".Params.order" "asc" }}
<li>{{ partial "partner.html" . }}</li>
{{ end }}
</ul>
</section>
{{ end }}
</section>

View File

@@ -0,0 +1,17 @@
{{ $_hugo_config := `{ "version": 1 }` }}
{{ $site := .Site }}
{{ range (split (.Get "types") ",") }}
<section class="members">
{{ $typeLabel := (split . "=") }}
{{ $type := (index $typeLabel 0) }}
{{ $label := (index $typeLabel 1) }}
<h2>{{ $label }}</h2>
<ul class="members shuffle">
{{ range where $site.AllPages "Params.type" $type }}
<li>{{ partial "team.html" . }}</li>
{{ end }}
</ul>
</section>
{{ end }}

View File

@@ -0,0 +1,23 @@
{{ $_hugo_config := `{ "version": 1 }` }}
<div class="ticket" {{ if .Get "soldOut" }}aria-disabled="true"{{end}}>
<div class="ticket-name">{{ .Get "name "}}</div>
<div class="ticket-price">{{ .Get "price" }}</div>
<div class="ticket-date">
{{ $lang := $.Page.Language.Lang }}
{{ partial "date-short.html" (dict "time" (.Get "starts") "lang" $lang) }}
-
{{ partial "date-short.html" (dict "time" (.Get "ends") "lang" $lang) }}
</div>
<div class="ticket-info">{{ .Get "info" }}</div>
{{ if .Get "soldOut" }}
<span class="btn" aria-disabled="true">{{ i18n "home_tickets_soldout" }}</span>
{{ else if .Get "close" }}
<span class="btn" aria-disabled="true">{{ i18n "home_tickets_close" }}</span>
{{ else }}
<a href="{{ .Get "url" }} "class="btn primary" rel="noreferrer" target="_blank">
{{ partial "icon.html" "ticket" }}
{{- i18n "home_tickets_action" -}}
</a>
{{ end }}
</div>

View File

@@ -0,0 +1,15 @@
{{ $_hugo_config := `{ "version": 1 }` }}
<section class="youtube-section {{ .Get "class" }}">
<div class="inner">
<h2>
{{ .Get "title" }}
</h2>
<div class="youtube-player" style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
<iframe src="//www.youtube.com/embed/{{ .Get "link" }}"
style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen
title="YouTube Video"></iframe>
</div>
</div>
</section>

View File

@@ -0,0 +1,14 @@
{{ define "main" }}
{{ .Content }}
<section>
<ul class="speakers shuffle">
{{ $speakers := where .Site.AllPages ".Section" "speakers" }}
{{ range where $speakers ".Kind" "page" }}
<li>{{ partial "speaker.html" . }}</li>
{{ end }}
</ul>
</section>
{{ end }}

View File

@@ -0,0 +1,62 @@
{{ define "main" }}
<div class="hero">
<header>
<div class="speaker-img" style="background-image: url({{ .Page.Params.photoURL }});"></div>
<div>
<h1>{{ .Page.Params.name }}</h1>
<ul class="socials">
{{ range .Page.Params.socials }}
<li>
<a href="{{ .link }}" class="social" rel="noreferrer" target="_blank">
{{ partial "icon.html" .icon }}
{{ .name }}
</a>
</li>
{{ end }}
</ul>
</div>
</header>
<div class="description">
<ul class="talks">
{{ range where .Site.RegularPages "Params.speakers" "intersect" (slice .Page.Params.key) }}
<li>
<a href="{{ .Permalink }}" class="visually-hidden">{{ .Title }}</a>
<a href="{{ .Permalink }}" class="talk tag-{{ anchorize (delimit (.Params.tags | default (slice)) "" ) }}">
<div class="tags">
{{ range .Params.tags }}
{{ range first 1 (where $.Site.Data.categories "key" .) }}
<span>{{ .name }}</span>
{{ end }}
{{ end }}
</div>
<a href="{{ .Permalink }}" class="talk">
<span class="language {{ anchorize .Params.language }}"></span>
<h3 class="text">{{ .Title }}</h3>
</a>
</li>
{{ end }}
</ul>
</div>
</div>
<section class="speaker">
<header>
<h2>{{ .Page.Params.city }}</h2>
<div class="speaker-company">{{ .Page.Params.company }}</div>
</header>
<div class="bio">
{{ .Content }}
</div>
</section>
{{ end }}

5
layouts/team/list.html Normal file
View File

@@ -0,0 +1,5 @@
{{ define "main" }}
{{ .Content }}
{{ end }}

11
layouts/team/single.html Normal file
View File

@@ -0,0 +1,11 @@
{{ define "main" }}
<div class="hero">
<h1>{{ .Title }}</h1>
</div>
<section class="content">
{{ .Content }}
</section>
{{ end }}

6902
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

36
package.json Normal file
View File

@@ -0,0 +1,36 @@
{
"name": "devfest-theme-hugo",
"version": "1.0.0",
"description": "A theme for a conference website. Created for DevFest Toulouse 2019",
"repository": "https://github.com/GDGToulouse/devfest-theme-hugo",
"author": "Igor Laborie <ilaborie@gmail.com>",
"license": "MIT",
"private": true,
"scripts": {
"watch:script": "rollup -c --watch",
"watch:style": "node-sass src/style/theme.scss -o static --watch",
"start": "run-p watch:*",
"build:icons": "node icons.js",
"build:script": "rollup -c rollup.config.prod.js",
"build:style": "node-sass src/style/theme.scss -o static; postcss static/theme.css --replace",
"build": "run-p build:*"
},
"devDependencies": {
"@babel/core": "^7.5.4",
"@babel/polyfill": "^7.2.5",
"@babel/preset-env": "^7.5.4",
"@types/js-yaml": "^3.12.1",
"cssnano": "^4.1.8",
"node-sass": "^4.11.0",
"npm-run-all": "^4.1.5",
"plop-logger": "^3.1.2",
"postcss-cli": "^6.1.3",
"postcss-preset-env": "^6.7.0",
"rollup": "^1.19.4",
"rollup-plugin-babel": "^4.3.1",
"rollup-plugin-node-resolve": "^5.2.0",
"rollup-plugin-uglify": "^6.0.1",
"sass-mq": "^5.0.1",
"tslib": "^1.10.0"
}
}

9
postcss.config.js Normal file
View File

@@ -0,0 +1,9 @@
module.exports = {
plugins: [
require('postcss-preset-env')({
autoprefixer: {grid: true},
stage: 3
}),
require('cssnano')({preset: 'default'})
]
};

7
robots.txt Normal file
View File

@@ -0,0 +1,7 @@
User-agent: *
# robotstxt.org - if ENV production variable is false robots will be disallowed.
{{ if eq (getenv "HUGO_ENV") "production" | or (eq .Site.Params.env "production") }}
Disallow:
{{ else }}
Disallow: /
{{ end }}

30
rollup.config.js Normal file
View File

@@ -0,0 +1,30 @@
import resolve from 'rollup-plugin-node-resolve';
import babel from 'rollup-plugin-babel';
const {Logger, LogLevel} = require('plop-logger');
const {colorEmojiConfig} = require('plop-logger');
Logger.config = colorEmojiConfig;
const logger = Logger.getLogger('icons');
logger.level = LogLevel.All;
const globals = {firebase: 'firebase'};
export default {
input: 'src/script/main.js',
output: [
{file: 'static/theme.js', format: 'esm', globals}
],
plugins: [
resolve(),
babel({
exclude: 'node_modules/**' // only transpile our source code
})
],
external: [
'firebase',
'firebase/firestore'
],
onwarn(warning) {
logger.warn(warning.message, warning);
}
}

10
rollup.config.prod.js Normal file
View File

@@ -0,0 +1,10 @@
import {default as defaultConfig} from './rollup.config';
import {uglify} from "rollup-plugin-uglify";
export default {
...defaultConfig,
plugins: [
...defaultConfig.plugins,
uglify({sourcemap: false})
]
};

4
src/icons/alert.svg Normal file
View File

@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512">
<path fill="currentColor"
d="M224 512c35.32 0 63.97-28.65 63.97-64H160.03c0 35.35 28.65 64 63.97 64zm215.39-149.71c-19.32-20.76-55.47-51.99-55.47-154.29 0-77.7-54.48-139.9-127.94-155.16V32c0-17.67-14.32-32-31.98-32s-31.98 14.33-31.98 32v20.84C118.56 68.1 64.08 130.3 64.08 208c0 102.3-36.15 133.53-55.47 154.29-6 6.45-8.66 14.16-8.61 21.71.11 16.4 12.98 32 32.1 32h383.8c19.12 0 32-15.6 32.1-32 .05-7.55-2.61-15.27-8.61-21.71z"></path>
</svg>

After

Width:  |  Height:  |  Size: 519 B

4
src/icons/calendar.svg Normal file
View File

@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512">
<path fill="currentColor"
d="M148 288h-40c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12zm108-12v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm96 0v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm-96 96v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm-96 0v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm192 0v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm96-260v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V112c0-26.5 21.5-48 48-48h48V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h128V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h48c26.5 0 48 21.5 48 48zm-48 346V160H48v298c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z"></path>
</svg>

After

Width:  |  Height:  |  Size: 978 B

4
src/icons/cfp.svg Normal file
View File

@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 352 512">
<path fill="currentColor"
d="M176 352c53.02 0 96-42.98 96-96V96c0-53.02-42.98-96-96-96S80 42.98 80 96v160c0 53.02 42.98 96 96 96zm160-160h-16c-8.84 0-16 7.16-16 16v48c0 74.8-64.49 134.82-140.79 127.38C96.71 376.89 48 317.11 48 250.3V208c0-8.84-7.16-16-16-16H16c-8.84 0-16 7.16-16 16v40.16c0 89.64 63.97 169.55 152 181.69V464H96c-8.84 0-16 7.16-16 16v16c0 8.84 7.16 16 16 16h160c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16h-56v-33.77C285.71 418.47 352 344.9 352 256v-48c0-8.84-7.16-16-16-16z"></path>
</svg>

After

Width:  |  Height:  |  Size: 585 B

4
src/icons/close.svg Normal file
View File

@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 352 512">
<path fill="currentColor"
d="M242.72 256l100.07-100.07c12.28-12.28 12.28-32.19 0-44.48l-22.24-22.24c-12.28-12.28-32.19-12.28-44.48 0L176 189.28 75.93 89.21c-12.28-12.28-32.19-12.28-44.48 0L9.21 111.45c-12.28 12.28-12.28 32.19 0 44.48L109.28 256 9.21 356.07c-12.28 12.28-12.28 32.19 0 44.48l22.24 22.24c12.28 12.28 32.2 12.28 44.48 0L176 322.72l100.07 100.07c12.28 12.28 32.2 12.28 44.48 0l22.24-22.24c12.28-12.28 12.28-32.19 0-44.48L242.72 256z"></path>
</svg>

After

Width:  |  Height:  |  Size: 537 B

4
src/icons/direction.svg Normal file
View File

@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<path fill="currentColor"
d="M502.61 233.32L278.68 9.39c-12.52-12.52-32.83-12.52-45.36 0L9.39 233.32c-12.52 12.53-12.52 32.83 0 45.36l223.93 223.93c12.52 12.53 32.83 12.53 45.36 0l223.93-223.93c12.52-12.53 12.52-32.83 0-45.36zm-100.98 12.56l-84.21 77.73c-5.12 4.73-13.43 1.1-13.43-5.88V264h-96v64c0 4.42-3.58 8-8 8h-32c-4.42 0-8-3.58-8-8v-80c0-17.67 14.33-32 32-32h112v-53.73c0-6.97 8.3-10.61 13.43-5.88l84.21 77.73c3.43 3.17 3.43 8.59 0 11.76z"></path>
</svg>

After

Width:  |  Height:  |  Size: 537 B

4
src/icons/email.svg Normal file
View File

@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<path fill="currentColor"
d="M502.3 190.8c3.9-3.1 9.7-.2 9.7 4.7V400c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V195.6c0-5 5.7-7.8 9.7-4.7 22.4 17.4 52.1 39.5 154.1 113.6 21.1 15.4 56.7 47.8 92.2 47.6 35.7.3 72-32.8 92.3-47.6 102-74.1 131.6-96.3 154-113.7zM256 320c23.2.4 56.6-29.2 73.4-41.4 132.7-96.3 142.8-104.7 173.4-128.7 5.8-4.5 9.2-11.5 9.2-18.9v-19c0-26.5-21.5-48-48-48H48C21.5 64 0 85.5 0 112v19c0 7.4 3.4 14.3 9.2 18.9 30.6 23.9 40.7 32.4 173.4 128.7 16.8 12.2 50.2 41.8 73.4 41.4z"></path>
</svg>

After

Width:  |  Height:  |  Size: 586 B

4
src/icons/facebook.svg Normal file
View File

@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 264 512">
<path fill="rgb(59,89,152)"
d="M76.7 512V283H0v-91h76.7v-71.7C76.7 42.4 124.3 0 193.8 0c33.3 0 61.9 2.5 70.2 3.6V85h-48.2c-37.8 0-45.1 18-45.1 44.3V192H256l-11.7 91h-73.6v229"></path>
</svg>

After

Width:  |  Height:  |  Size: 267 B

4
src/icons/github.svg Normal file
View File

@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512">
<path fill="#000000"
d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"></path>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

1
src/icons/home.svg Normal file
View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><path fill="currentColor" d="M280.37 148.26L96 300.11V464a16 16 0 0 0 16 16l112.06-.29a16 16 0 0 0 15.92-16V368a16 16 0 0 1 16-16h64a16 16 0 0 1 16 16v95.64a16 16 0 0 0 16 16.05L464 480a16 16 0 0 0 16-16V300L295.67 148.26a12.19 12.19 0 0 0-15.3 0zM571.6 251.47L488 182.56V44.05a12 12 0 0 0-12-12h-56a12 12 0 0 0-12 12v72.61L318.47 43a48 48 0 0 0-61 0L4.34 251.47a12 12 0 0 0-1.6 16.9l25.5 31A12 12 0 0 0 45.15 301l235.22-193.74a12.19 12.19 0 0 1 15.3 0L530.9 301a12 12 0 0 0 16.9-1.6l25.5-31a12 12 0 0 0-1.7-16.93z"></path></svg>

After

Width:  |  Height:  |  Size: 592 B

View File

@@ -0,0 +1,8 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
<rect x="5" y="14" width="3" height="6" stroke-width="1" stroke="black" fill="black"></rect>
<rect x="11" y="9" width="3" height="11" stroke-width="1" stroke="black" fill="black"></rect>
<rect x="17" y="4" width="3" height="16" stroke-width="1" stroke="black" fill="black"></rect>
</svg>

After

Width:  |  Height:  |  Size: 387 B

View File

@@ -0,0 +1,8 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
<rect x="5" y="14" width="3" height="6" stroke-width="1" stroke="black" fill="black"></rect>
<rect x="11" y="9" width="3" height="11" stroke-width="1" stroke="black" fill="none"></rect>
<rect x="17" y="4" width="3" height="16" stroke-width="1" stroke="black" fill="none"></rect>
</svg>

After

Width:  |  Height:  |  Size: 385 B

View File

@@ -0,0 +1,8 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
<rect x="5" y="14" width="3" height="6" stroke-width="1" stroke="black" fill="black"></rect>
<rect x="11" y="9" width="3" height="11" stroke-width="1" stroke="black" fill="black"></rect>
<rect x="17" y="4" width="3" height="16" stroke-width="1" stroke="black" fill="none"></rect>
</svg>

After

Width:  |  Height:  |  Size: 386 B

4
src/icons/link.svg Normal file
View File

@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<path fill="currentColor"
d="M326.612 185.391c59.747 59.809 58.927 155.698.36 214.59-.11.12-.24.25-.36.37l-67.2 67.2c-59.27 59.27-155.699 59.262-214.96 0-59.27-59.26-59.27-155.7 0-214.96l37.106-37.106c9.84-9.84 26.786-3.3 27.294 10.606.648 17.722 3.826 35.527 9.69 52.721 1.986 5.822.567 12.262-3.783 16.612l-13.087 13.087c-28.026 28.026-28.905 73.66-1.155 101.96 28.024 28.579 74.086 28.749 102.325.51l67.2-67.19c28.191-28.191 28.073-73.757 0-101.83-3.701-3.694-7.429-6.564-10.341-8.569a16.037 16.037 0 0 1-6.947-12.606c-.396-10.567 3.348-21.456 11.698-29.806l21.054-21.055c5.521-5.521 14.182-6.199 20.584-1.731a152.482 152.482 0 0 1 20.522 17.197zM467.547 44.449c-59.261-59.262-155.69-59.27-214.96 0l-67.2 67.2c-.12.12-.25.25-.36.37-58.566 58.892-59.387 154.781.36 214.59a152.454 152.454 0 0 0 20.521 17.196c6.402 4.468 15.064 3.789 20.584-1.731l21.054-21.055c8.35-8.35 12.094-19.239 11.698-29.806a16.037 16.037 0 0 0-6.947-12.606c-2.912-2.005-6.64-4.875-10.341-8.569-28.073-28.073-28.191-73.639 0-101.83l67.2-67.19c28.239-28.239 74.3-28.069 102.325.51 27.75 28.3 26.872 73.934-1.155 101.96l-13.087 13.087c-4.35 4.35-5.769 10.79-3.783 16.612 5.864 17.194 9.042 34.999 9.69 52.721.509 13.906 17.454 20.446 27.294 10.606l37.106-37.106c59.271-59.259 59.271-155.699.001-214.959z"></path>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

4
src/icons/linkedin.svg Normal file
View File

@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512">
<path fill="rgb(0,119,181)"
d="M100.3 448H7.4V148.9h92.9V448zM53.8 108.1C24.1 108.1 0 83.5 0 53.8S24.1 0 53.8 0s53.8 24.1 53.8 53.8-24.1 54.3-53.8 54.3zM448 448h-92.7V302.4c0-34.7-.7-79.2-48.3-79.2-48.3 0-55.7 37.7-55.7 76.7V448h-92.8V148.9h89.1v40.8h1.3c12.4-23.5 42.7-48.3 87.9-48.3 94 0 111.3 61.9 111.3 142.3V448h-.1z"></path>
</svg>

After

Width:  |  Height:  |  Size: 414 B

3
src/icons/map-marker.svg Normal file
View File

@@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512" >
<path fill="currentColor" d="M172.268 501.67C26.97 291.031 0 269.413 0 192 0 85.961 85.961 0 192 0s192 85.961 192 192c0 77.413-26.97 99.031-172.268 309.67-9.535 13.774-29.93 13.773-39.464 0zM192 272c44.183 0 80-35.817 80-80s-35.817-80-80-80-80 35.817-80 80 35.817 80 80 80z"></path>
</svg>

After

Width:  |  Height:  |  Size: 357 B

4
src/icons/menu.svg Normal file
View File

@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512">
<path fill="currentColor"
d="M16 132h416c8.837 0 16-7.163 16-16V76c0-8.837-7.163-16-16-16H16C7.163 60 0 67.163 0 76v40c0 8.837 7.163 16 16 16zm0 160h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16zm0 160h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16z"></path>
</svg>

After

Width:  |  Height:  |  Size: 463 B

4
src/icons/pdf.svg Normal file
View File

@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512">
<path fill="currentColor"
d="M369.9 97.9L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM332.1 128H256V51.9l76.1 76.1zM48 464V48h160v104c0 13.3 10.7 24 24 24h104v288H48zm250.2-143.7c-12.2-12-47-8.7-64.4-6.5-17.2-10.5-28.7-25-36.8-46.3 3.9-16.1 10.1-40.6 5.4-56-4.2-26.2-37.8-23.6-42.6-5.9-4.4 16.1-.4 38.5 7 67.1-10 23.9-24.9 56-35.4 74.4-20 10.3-47 26.2-51 46.2-3.3 15.8 26 55.2 76.1-31.2 22.4-7.4 46.8-16.5 68.4-20.1 18.9 10.2 41 17 55.8 17 25.5 0 28-28.2 17.5-38.7zm-198.1 77.8c5.1-13.7 24.5-29.5 30.4-35-19 30.3-30.4 35.7-30.4 35zm81.6-190.6c7.4 0 6.7 32.1 1.8 40.8-4.4-13.9-4.3-40.8-1.8-40.8zm-24.4 136.6c9.7-16.9 18-37 24.7-54.7 8.3 15.1 18.9 27.2 30.1 35.5-20.8 4.3-38.9 13.1-54.8 19.2zm131.6-5s-5 6-37.3-7.8c35.1-2.6 40.9 5.4 37.3 7.8z"></path>
</svg>

After

Width:  |  Height:  |  Size: 921 B

4
src/icons/right.svg Normal file
View File

@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<path fill="currentColor"
d="M256 8c137 0 248 111 248 248S393 504 256 504 8 393 8 256 119 8 256 8zM140 300h116v70.9c0 10.7 13 16.1 20.5 8.5l114.3-114.9c4.7-4.7 4.7-12.2 0-16.9l-114.3-115c-7.6-7.6-20.5-2.2-20.5 8.5V212H140c-6.6 0-12 5.4-12 12v64c0 6.6 5.4 12 12 12z"></path>
</svg>

After

Width:  |  Height:  |  Size: 357 B

View File

@@ -0,0 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 25.166666 37.8704414">
<path fill="none" stroke="currentColor" stroke-width="2.5" stroke-miterlimit="10"
d="M12.5833445 36.6204414h-0.0000229C6.3499947 36.6204414 1.25 31.5204487 1.25 25.2871208V12.5833216C1.25 6.3499947 6.3499951 1.25 12.5833216 1.25h0.0000229c6.2333269 0 11.3333216 5.0999947 11.3333216 11.3333216v12.7037992C23.916666 31.5204487 18.8166714 36.6204414 12.5833445 36.6204414z"></path>
<path style="animation: scrollDownMove .8s ease-in-out alternate infinite;" fill="currentColor"
d="M13.0833359 19.2157116h-0.9192753c-1.0999985 0-1.9999971-0.8999996-1.9999971-1.9999981v-5.428606c0-1.0999994 0.8999987-1.9999981 1.9999971-1.9999981h0.9192753c1.0999985 0 1.9999981 0.8999987 1.9999981 1.9999981v5.428606C15.083334 18.315712 14.1833344 19.2157116 13.0833359 19.2157116z"></path>
</svg>

After

Width:  |  Height:  |  Size: 883 B

4
src/icons/site.svg Normal file
View File

@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512">
<path fill="currentColor"
d="M336.5 160C322 70.7 287.8 8 248 8s-74 62.7-88.5 152h177zM152 256c0 22.2 1.2 43.5 3.3 64h185.3c2.1-20.5 3.3-41.8 3.3-64s-1.2-43.5-3.3-64H155.3c-2.1 20.5-3.3 41.8-3.3 64zm324.7-96c-28.6-67.9-86.5-120.4-158-141.6 24.4 33.8 41.2 84.7 50 141.6h108zM177.2 18.4C105.8 39.6 47.8 92.1 19.3 160h108c8.7-56.9 25.5-107.8 49.9-141.6zM487.4 192H372.7c2.1 21 3.3 42.5 3.3 64s-1.2 43-3.3 64h114.6c5.5-20.5 8.6-41.8 8.6-64s-3.1-43.5-8.5-64zM120 256c0-21.5 1.2-43 3.3-64H8.6C3.2 212.5 0 233.8 0 256s3.2 43.5 8.6 64h114.6c-2-21-3.2-42.5-3.2-64zm39.5 96c14.5 89.3 48.7 152 88.5 152s74-62.7 88.5-152h-177zm159.3 141.6c71.4-21.2 129.4-73.7 158-141.6h-108c-8.8 56.9-25.6 107.8-50 141.6zM19.3 352c28.6 67.9 86.5 120.4 158 141.6-24.4-33.8-41.2-84.7-50-141.6h-108z"></path>
</svg>

After

Width:  |  Height:  |  Size: 860 B

16
src/icons/slides.svg Normal file
View File

@@ -0,0 +1,16 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
<line x1="3" y1="4" x2="20.85" y2="4"
stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round"></line>
<rect x="5" y="4" rx="2" ry="2" width="14" height="10"
stroke-width="1.5" stroke="currentColor" fill="none"></rect>
<polyline points="7,20 12,14.5 17,20" stroke="currentColor" stroke-width="1.5"
stroke-linecap="round"
fill="none"></polyline>
<!-- <polyline points="7,11 9,8 11,10 13,6" stroke="currentColor" stroke-width=".5"-->
<!-- stroke-linecap="round" stroke-linejoin="round"-->
<!-- fill="none"></polyline>-->
<!-- <line x1="14" y1="7" x2="17.5" y2="7" stroke-width=".65" stroke="currentColor"></line>-->
<!-- <line x1="14" y1="9" x2="17.5" y2="9" stroke-width=".65" stroke="currentColor"></line>-->
<!-- <line x1="13" y1="11" x2="17.5" y2="11" stroke-width=".65" stroke="currentColor"></line>-->
</svg>

After

Width:  |  Height:  |  Size: 1019 B

4
src/icons/subscribe.svg Normal file
View File

@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<path fill="currentColor"
d="M440 6.5L24 246.4c-34.4 19.9-31.1 70.8 5.7 85.9L144 379.6V464c0 46.4 59.2 65.5 86.6 28.6l43.8-59.1 111.9 46.2c5.9 2.4 12.1 3.6 18.3 3.6 8.2 0 16.3-2.1 23.6-6.2 12.8-7.2 21.6-20 23.9-34.5l59.4-387.2c6.1-40.1-36.9-68.8-71.5-48.9zM192 464v-64.6l36.6 15.1L192 464zm212.6-28.7l-153.8-63.5L391 169.5c10.7-15.5-9.5-33.5-23.7-21.2L155.8 332.6 48 288 464 48l-59.4 387.3z"></path>
</svg>

After

Width:  |  Height:  |  Size: 483 B

4
src/icons/ticket.svg Normal file
View File

@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512">
<path fill="currentColor"
d="M128 160h320v192H128V160zm400 96c0 26.51 21.49 48 48 48v96c0 26.51-21.49 48-48 48H48c-26.51 0-48-21.49-48-48v-96c26.51 0 48-21.49 48-48s-21.49-48-48-48v-96c0-26.51 21.49-48 48-48h480c26.51 0 48 21.49 48 48v96c-26.51 0-48 21.49-48 48zm-48-104c0-13.255-10.745-24-24-24H120c-13.255 0-24 10.745-24 24v208c0 13.255 10.745 24 24 24h336c13.255 0 24-10.745 24-24V152z"></path>
</svg>

After

Width:  |  Height:  |  Size: 481 B

4
src/icons/twitter.svg Normal file
View File

@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<path fill="rgb(64,153,255)"
d="M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z"></path>
</svg>

After

Width:  |  Height:  |  Size: 916 B

4
src/icons/youtube.svg Normal file
View File

@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512">
<path fill="rgb(205,32,31)"
d="M549.655 124.083c-6.281-23.65-24.787-42.276-48.284-48.597C458.781 64 288 64 288 64S117.22 64 74.629 75.486c-23.497 6.322-42.003 24.947-48.284 48.597-11.412 42.867-11.412 132.305-11.412 132.305s0 89.438 11.412 132.305c6.281 23.65 24.787 41.5 48.284 47.821C117.22 448 288 448 288 448s170.78 0 213.371-11.486c23.497-6.321 42.003-24.171 48.284-47.821 11.412-42.867 11.412-132.305 11.412-132.305s0-89.438-11.412-132.305zm-317.51 213.508V175.185l142.739 81.205-142.739 81.201z"></path>
</svg>

After

Width:  |  Height:  |  Size: 594 B

15
src/script/background.js Normal file
View File

@@ -0,0 +1,15 @@
import './konami';
new Konami(function () {
const elt = document.querySelector('.jumbo');
if (elt) {
elt.style.backgroundImage = 'url(/images/wtf/serious.jpg)';
}
});
setTimeout(function () {
const jumboOverlay = document.querySelector('#jumbo-overlay');
if (jumboOverlay) {
jumboOverlay.classList.add('show');
}
}, 500);

141
src/script/konami.js Normal file
View File

@@ -0,0 +1,141 @@
// From https://github.com/snaptortoise/konami-js
var Konami = function (callback) {
var konami = {
addEvent: function (obj, type, fn, ref_obj) {
if (obj.addEventListener)
obj.addEventListener(type, fn, false);
else if (obj.attachEvent) {
// IE
obj["e" + type + fn] = fn;
obj[type + fn] = function () {
obj["e" + type + fn](window.event, ref_obj);
}
obj.attachEvent("on" + type, obj[type + fn]);
}
},
removeEvent: function (obj, eventName, eventCallback) {
if (obj.removeEventListener) {
obj.removeEventListener(eventName, eventCallback);
} else if (obj.attachEvent) {
obj.detachEvent(eventName);
}
},
input: "",
pattern: "38384040373937396665",
keydownHandler: function (e, ref_obj) {
if (ref_obj) {
konami = ref_obj;
} // IE
konami.input += e ? e.keyCode : event.keyCode;
if (konami.input.length > konami.pattern.length) {
konami.input = konami.input.substr((konami.input.length - konami.pattern.length));
}
if (konami.input === konami.pattern) {
konami.code(konami._currentLink);
konami.input = '';
e.preventDefault();
return false;
}
},
load: function (link) {
this._currentLink = link;
this.addEvent(document, "keydown", this.keydownHandler, this);
this.iphone.load(link);
},
unload: function () {
this.removeEvent(document, 'keydown', this.keydownHandler);
this.iphone.unload();
},
code: function (link) {
window.location = link
},
iphone: {
start_x: 0,
start_y: 0,
stop_x: 0,
stop_y: 0,
tap: false,
capture: false,
orig_keys: "",
keys: ["UP", "UP", "DOWN", "DOWN", "LEFT", "RIGHT", "LEFT", "RIGHT", "TAP", "TAP"],
input: [],
code: function (link) {
konami.code(link);
},
touchmoveHandler: function (e) {
if (e.touches.length === 1 && konami.iphone.capture === true) {
var touch = e.touches[0];
konami.iphone.stop_x = touch.pageX;
konami.iphone.stop_y = touch.pageY;
konami.iphone.tap = false;
konami.iphone.capture = false;
konami.iphone.check_direction();
}
},
touchendHandler: function () {
konami.iphone.input.push(konami.iphone.check_direction());
if (konami.iphone.input.length > konami.iphone.keys.length) konami.iphone.input.shift();
if (konami.iphone.input.length === konami.iphone.keys.length) {
var match = true;
for (var i = 0; i < konami.iphone.keys.length; i++) {
if (konami.iphone.input[i] !== konami.iphone.keys[i]) {
match = false;
}
}
if (match) {
konami.iphone.code(konami._currentLink);
}
}
},
touchstartHandler: function (e) {
konami.iphone.start_x = e.changedTouches[0].pageX;
konami.iphone.start_y = e.changedTouches[0].pageY;
konami.iphone.tap = true;
konami.iphone.capture = true;
},
load: function (link) {
this.orig_keys = this.keys;
konami.addEvent(document, "touchmove", this.touchmoveHandler);
konami.addEvent(document, "touchend", this.touchendHandler, false);
konami.addEvent(document, "touchstart", this.touchstartHandler);
},
unload: function () {
konami.removeEvent(document, 'touchmove', this.touchmoveHandler);
konami.removeEvent(document, 'touchend', this.touchendHandler);
konami.removeEvent(document, 'touchstart', this.touchstartHandler);
},
check_direction: function () {
x_magnitude = Math.abs(this.start_x - this.stop_x);
y_magnitude = Math.abs(this.start_y - this.stop_y);
x = ((this.start_x - this.stop_x) < 0) ? "RIGHT" : "LEFT";
y = ((this.start_y - this.stop_y) < 0) ? "DOWN" : "UP";
result = (x_magnitude > y_magnitude) ? x : y;
result = (this.tap === true) ? "TAP" : result;
return result;
}
}
};
typeof callback === "string" && konami.load(callback);
if (typeof callback === "function") {
konami.code = callback;
konami.load();
}
return konami;
};
if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
module.exports = Konami;
} else {
if (typeof define === 'function' && define.amd) {
define([], function () {
return Konami;
});
} else {
window.Konami = Konami;
}
}

4
src/script/main.js Normal file
View File

@@ -0,0 +1,4 @@
import './polyfills';
import './shuffle';
import './background';

Some files were not shown because too many files have changed in this diff Show More