Initial commit
1
.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
node_modules
|
||||
6
404.html
Executable file
@@ -0,0 +1,6 @@
|
||||
<article class="error">
|
||||
<h1>
|
||||
This is not the page you were looking for
|
||||
</h1>
|
||||
</article>
|
||||
|
||||
20
LICENSE
Normal 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
@@ -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" %}}
|
||||
|
||||

|
||||
|
||||
## 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 %}}
|
||||
```
|
||||
|
||||

|
||||
|
||||
|
||||
#### 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 %}}
|
||||
```
|
||||
|
||||

|
||||
|
||||
|
||||
#### Subscription block
|
||||
|
||||
Call to subscribe
|
||||
|
||||
Use the site param `subscriptionUrl`.
|
||||
|
||||
```hugo
|
||||
{{% home-subscribe class="primary" %}}
|
||||
|
||||
## Get notified about the important conference updates
|
||||
|
||||
{{% /home-subscribe %}}
|
||||
```
|
||||
|
||||

|
||||
|
||||
|
||||
### 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 %}}
|
||||
```
|
||||
|
||||

|
||||
|
||||
#### 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 %}}
|
||||
```
|
||||
|
||||

|
||||
|
||||
### Partners block
|
||||
|
||||
Show your partners
|
||||
|
||||
```hugo
|
||||
{{% partners categories="platinium,gold,soutien,media,communautes" %}}
|
||||
# Partners
|
||||
{{% /partners %}}
|
||||
```
|
||||
|
||||

|
||||
|
||||
#### 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 %}}
|
||||
```
|
||||
|
||||

|
||||
|
||||
|
||||
### 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
@@ -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
@@ -0,0 +1,6 @@
|
||||
---
|
||||
title: "{{ replace .TranslationBaseName "-" " " | title }}"
|
||||
---
|
||||
|
||||
{{< hero >}}
|
||||
{{< /hero >}}
|
||||
15
archetypes/partners.md
Normal 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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
|
After Width: | Height: | Size: 1.1 MiB |
BIN
images/block-info.png
Normal file
|
After Width: | Height: | Size: 43 KiB |
BIN
images/block-map.png
Normal file
|
After Width: | Height: | Size: 392 KiB |
BIN
images/block-partners.png
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
images/block-ticket.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
images/feature-speakers.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
images/screenshot.png
Normal file
|
After Width: | Height: | Size: 1.4 MiB |
BIN
images/subscribe.png
Normal file
|
After Width: | Height: | Size: 9.7 KiB |
BIN
images/tn.png
Normal file
|
After Width: | Height: | Size: 638 KiB |
3
layouts/404.html
Normal file
@@ -0,0 +1,3 @@
|
||||
{{ define "main"}}
|
||||
<h1 class="error">Oops!, page {{ .Permalink }} not found !</h1>
|
||||
{{ end }}
|
||||
29
layouts/_default/baseof.html
Normal 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>
|
||||
15
layouts/_default/list.html
Normal file
@@ -0,0 +1,15 @@
|
||||
{{ define "main" }}
|
||||
|
||||
{{ .Content }}
|
||||
|
||||
<hr>
|
||||
|
||||
<ul class="pages">
|
||||
{{ range .Pages }}
|
||||
<li>
|
||||
<a href="{{ .URL }}"> {{ .Title }}</a>
|
||||
</li>
|
||||
{{ end }}
|
||||
</ul>
|
||||
|
||||
{{ end }}
|
||||
14
layouts/_default/single.html
Normal 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
@@ -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
@@ -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
@@ -0,0 +1,6 @@
|
||||
{{ define "main" }}
|
||||
|
||||
{{ .Content }}
|
||||
|
||||
{{ end }}
|
||||
|
||||
5
layouts/partials/date-long.html
Normal 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 }}
|
||||
13
layouts/partials/date-short.html
Normal 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 }}
|
||||
|
||||
87
layouts/partials/footer.html
Normal 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>
|
||||
53
layouts/partials/head.html
Normal 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>
|
||||
54
layouts/partials/header.html
Normal 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>
|
||||
3
layouts/partials/icon.html
Normal file
@@ -0,0 +1,3 @@
|
||||
<svg class="icon icon-{{ . }}">
|
||||
<use xlink:href="#{{ . }}"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 68 B |
4
layouts/partials/partner.html
Normal file
@@ -0,0 +1,4 @@
|
||||
<a class="partner"
|
||||
href="{{ .URL }}"
|
||||
title="{{ .Title }}"
|
||||
style="background-image: url({{ .Params.logo }});">{{ .Title }}</a>
|
||||
50
layouts/partials/schedule-session.html
Normal 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>
|
||||
49
layouts/partials/session.html
Normal 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>
|
||||
14
layouts/partials/social-sharer.html
Normal 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 -}}
|
||||
9
layouts/partials/speaker.html
Normal 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>
|
||||
15
layouts/partials/team.html
Normal 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>
|
||||
15
layouts/partials/ticket.html
Normal 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>
|
||||
5
layouts/partners/list.html
Normal file
@@ -0,0 +1,5 @@
|
||||
{{ define "main" }}
|
||||
|
||||
{{ .Content }}
|
||||
|
||||
{{ end }}
|
||||
63
layouts/partners/single.html
Normal 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
@@ -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 }}
|
||||
32
layouts/sessions/list.html
Normal 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 }}
|
||||
63
layouts/sessions/single.html
Normal 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 }}
|
||||
8
layouts/shortcodes/album.html
Normal 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>
|
||||
11
layouts/shortcodes/button-link.html
Normal 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>
|
||||
|
||||
6
layouts/shortcodes/centered-img.html
Normal file
@@ -0,0 +1,6 @@
|
||||
<div class="centered-img">
|
||||
<img
|
||||
src="{{.Get "src" }}"
|
||||
alt="{{.Get "alt" | default "" }}"
|
||||
width="{{.Get "width" | default "auto" }}">
|
||||
</div>
|
||||
7
layouts/shortcodes/hero.html
Normal file
@@ -0,0 +1,7 @@
|
||||
{{ $_hugo_config := `{ "version": 1 }` }}
|
||||
<div class="hero">
|
||||
<h1>{{ $.Page.Title }}</h1>
|
||||
<div class="description">
|
||||
{{ .Inner }}
|
||||
</div>
|
||||
</div>
|
||||
22
layouts/shortcodes/home-info.html
Normal 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>
|
||||
23
layouts/shortcodes/home-location.html
Normal 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>
|
||||
16
layouts/shortcodes/home-speakers.html
Normal 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>
|
||||
9
layouts/shortcodes/home-subscribe.html
Normal 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>
|
||||
4
layouts/shortcodes/home-tickets.html
Normal file
@@ -0,0 +1,4 @@
|
||||
{{ $_hugo_config := `{ "version": 1 }` }}
|
||||
<section class="tickets">
|
||||
{{ .Inner }}
|
||||
</section>
|
||||
3
layouts/shortcodes/icon.html
Normal file
@@ -0,0 +1,3 @@
|
||||
<svg class="icon icon-{{ .Get 0 }}">
|
||||
<use xlink:href="#{{ .Get 0 }}"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 78 B |
19
layouts/shortcodes/jumbo.html
Normal 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>
|
||||
21
layouts/shortcodes/partners.html
Normal 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>
|
||||
17
layouts/shortcodes/teams.html
Normal 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 }}
|
||||
23
layouts/shortcodes/ticket.html
Normal 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>
|
||||
15
layouts/shortcodes/youtube-section.html
Normal 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>
|
||||
14
layouts/speakers/list.html
Normal 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 }}
|
||||
62
layouts/speakers/single.html
Normal 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
@@ -0,0 +1,5 @@
|
||||
{{ define "main" }}
|
||||
|
||||
{{ .Content }}
|
||||
|
||||
{{ end }}
|
||||
11
layouts/team/single.html
Normal 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
36
package.json
Normal 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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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 |
8
src/icons/level-advanced.svg
Normal 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 |
8
src/icons/level-beginner.svg
Normal 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 |
8
src/icons/level-intermediate.svg
Normal 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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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 |
6
src/icons/scroll-down.svg
Normal 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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -0,0 +1,4 @@
|
||||
import './polyfills';
|
||||
import './shuffle';
|
||||
import './background';
|
||||
|
||||