jekyll-theme-ethereal 0.4.4 → 0.5.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +54 -1
- data/_includes/contact_form.html +11 -7
- data/_includes/contact_script.html +60 -22
- data/_includes/head.html +11 -1
- data/_includes/panel_contact.html +4 -4
- data/_includes/panel_map.html +71 -97
- data/_includes/scripts.html +8 -19
- data/_includes/search.html +8 -6
- data/_layouts/default.html +4 -4
- data/_sass/large.scss +49 -0
- data/_sass/large/base/_page.scss +0 -0
- data/_sass/large/base/_reset.scss +0 -0
- data/_sass/large/base/_typography.scss +11 -0
- data/_sass/large/components/_actions.scss +0 -0
- data/_sass/large/components/_button.scss +0 -0
- data/_sass/large/components/_contact-icons.scss +0 -0
- data/_sass/large/components/_form.scss +0 -0
- data/_sass/large/components/_gallery.scss +0 -0
- data/_sass/large/components/_grid-icons.scss +0 -0
- data/_sass/large/components/_icon.scss +0 -0
- data/_sass/large/components/_icons.scss +0 -0
- data/_sass/large/components/_image.scss +0 -0
- data/_sass/large/components/_list.scss +0 -0
- data/_sass/large/components/_panel-banner.scss +0 -0
- data/_sass/large/components/_panel-map.scss +0 -0
- data/_sass/large/components/_panel-spotlight.scss +0 -0
- data/_sass/large/components/_panel.scss +0 -0
- data/_sass/large/components/_table.scss +0 -0
- data/_sass/large/layout/_footer.scss +0 -0
- data/_sass/large/layout/_header.scss +0 -0
- data/_sass/large/layout/_page-wrapper.scss +0 -0
- data/_sass/large/layout/_wrapper.scss +0 -0
- data/_sass/libs/_breakpoints.scss +164 -164
- data/_sass/libs/_functions.scss +32 -32
- data/_sass/libs/_mixins.scss +225 -49
- data/_sass/libs/_vars.scss +40 -40
- data/_sass/libs/_vendor.scss +331 -331
- data/_sass/main.scss +25 -118
- data/_sass/main/base/_page.scss +99 -0
- data/_sass/main/base/_reset.scss +76 -0
- data/_sass/main/base/_typography.scss +193 -0
- data/_sass/main/components/_actions.scss +63 -0
- data/_sass/main/components/_button.scss +154 -0
- data/_sass/main/components/_contact-icons.scss +72 -0
- data/_sass/main/components/_form.scss +253 -0
- data/_sass/main/components/_gallery.scss +168 -0
- data/_sass/main/components/_grid-icons.scss +139 -0
- data/_sass/main/components/_icon.scss +33 -0
- data/_sass/main/components/_icons.scss +28 -0
- data/_sass/main/components/_image.scss +169 -0
- data/_sass/main/components/_list.scss +56 -0
- data/_sass/main/components/_panel-banner.scss +52 -0
- data/_sass/main/components/_panel-map.scss +0 -0
- data/_sass/main/components/_panel-spotlight.scss +62 -0
- data/_sass/main/components/_panel.scss +224 -0
- data/_sass/main/components/_table.scss +81 -0
- data/_sass/main/layout/_footer.scss +30 -0
- data/_sass/main/layout/_header.scss +35 -0
- data/_sass/main/layout/_page-wrapper.scss +22 -0
- data/_sass/main/layout/_wrapper.scss +85 -0
- data/_sass/medium.scss +48 -0
- data/_sass/medium/base/_page.scss +0 -0
- data/_sass/medium/base/_reset.scss +0 -0
- data/_sass/medium/base/_typography.scss +0 -0
- data/_sass/medium/components/_actions.scss +0 -0
- data/_sass/medium/components/_button.scss +0 -0
- data/_sass/medium/components/_contact-icons.scss +0 -0
- data/_sass/medium/components/_form.scss +0 -0
- data/_sass/medium/components/_gallery.scss +11 -0
- data/_sass/medium/components/_grid-icons.scss +0 -0
- data/_sass/medium/components/_icon.scss +0 -0
- data/_sass/medium/components/_icons.scss +0 -0
- data/_sass/medium/components/_image.scss +0 -0
- data/_sass/medium/components/_list.scss +0 -0
- data/_sass/medium/components/_panel-banner.scss +0 -0
- data/_sass/medium/components/_panel-map.scss +0 -0
- data/_sass/medium/components/_panel-spotlight.scss +0 -0
- data/_sass/medium/components/_panel.scss +0 -0
- data/_sass/medium/components/_table.scss +0 -0
- data/_sass/medium/layout/_footer.scss +0 -0
- data/_sass/medium/layout/_header.scss +0 -0
- data/_sass/medium/layout/_page-wrapper.scss +0 -0
- data/_sass/medium/layout/_wrapper.scss +0 -0
- data/_sass/noscript.scss +12 -12
- data/_sass/short.scss +49 -0
- data/_sass/short/base/_page.scss +0 -0
- data/_sass/short/base/_reset.scss +0 -0
- data/_sass/short/base/_typography.scss +0 -0
- data/_sass/short/components/_actions.scss +0 -0
- data/_sass/short/components/_button.scss +0 -0
- data/_sass/short/components/_contact-icons.scss +0 -0
- data/_sass/short/components/_form.scss +1 -0
- data/_sass/short/components/_gallery.scss +0 -0
- data/_sass/short/components/_grid-icons.scss +0 -0
- data/_sass/short/components/_icon.scss +0 -0
- data/_sass/short/components/_icons.scss +0 -0
- data/_sass/short/components/_image.scss +0 -0
- data/_sass/short/components/_list.scss +0 -0
- data/_sass/short/components/_panel-banner.scss +0 -0
- data/_sass/short/components/_panel-map.scss +0 -0
- data/_sass/short/components/_panel-spotlight.scss +0 -0
- data/_sass/short/components/_panel.scss +0 -0
- data/_sass/short/components/_table.scss +0 -0
- data/_sass/short/layout/_footer.scss +0 -0
- data/_sass/short/layout/_header.scss +0 -0
- data/_sass/short/layout/_page-wrapper.scss +9 -0
- data/_sass/short/layout/_wrapper.scss +0 -0
- data/_sass/small.scss +50 -0
- data/_sass/small/base/_page.scss +18 -0
- data/_sass/small/base/_reset.scss +0 -0
- data/_sass/small/base/_typography.scss +67 -0
- data/_sass/small/components/_actions.scss +0 -0
- data/_sass/small/components/_button.scss +0 -0
- data/_sass/small/components/_contact-icons.scss +0 -0
- data/_sass/small/components/_form.scss +27 -0
- data/_sass/small/components/_gallery.scss +38 -0
- data/_sass/small/components/_grid-icons.scss +29 -0
- data/_sass/small/components/_icon.scss +0 -0
- data/_sass/small/components/_icons.scss +0 -0
- data/_sass/small/components/_image.scss +0 -0
- data/_sass/small/components/_list.scss +0 -0
- data/_sass/small/components/_panel-banner.scss +37 -0
- data/_sass/small/components/_panel-map.scss +13 -0
- data/_sass/small/components/_panel-spotlight.scss +18 -0
- data/_sass/small/components/_panel.scss +80 -0
- data/_sass/small/components/_table.scss +0 -0
- data/_sass/small/layout/_footer.scss +34 -0
- data/_sass/small/layout/_header.scss +0 -0
- data/_sass/small/layout/_page-wrapper.scss +12 -0
- data/_sass/small/layout/_wrapper.scss +26 -0
- data/{_sass/components/_cookieconsent.scss → assets/css/cookieconsent.css} +3 -2
- data/assets/css/cookieconsent.min.css +1 -0
- data/assets/css/fontawesome-all.min.css +1 -1
- data/assets/css/large.scss +5 -0
- data/assets/css/mapbox-gl.css +1 -600
- data/assets/css/mapbox-gl.min.css +1 -0
- data/assets/css/mapbox-gl.panel.css +27 -0
- data/assets/css/mapbox-gl.panel.min.css +1 -0
- data/assets/css/medium.scss +5 -0
- data/assets/css/short.scss +5 -0
- data/assets/css/small.scss +5 -0
- data/assets/js/cookieconsent.style.min.js +1 -0
- data/assets/js/lazy-loading.min.js +1 -0
- data/assets/js/main.js +2 -2
- data/assets/js/main.min.js +42 -0
- data/assets/js/mapbox-gl.min.js +40 -0
- metadata +129 -25
- data/_sass/base/_page.scss +0 -117
- data/_sass/base/_reset.scss +0 -76
- data/_sass/base/_typography.scss +0 -271
- data/_sass/components/_actions.scss +0 -63
- data/_sass/components/_button.scss +0 -154
- data/_sass/components/_contact-icons.scss +0 -72
- data/_sass/components/_form.scss +0 -279
- data/_sass/components/_gallery.scss +0 -218
- data/_sass/components/_grid-icons.scss +0 -166
- data/_sass/components/_icon.scss +0 -33
- data/_sass/components/_icons.scss +0 -28
- data/_sass/components/_image.scss +0 -169
- data/_sass/components/_list.scss +0 -56
- data/_sass/components/_panel-banner.scss +0 -90
- data/_sass/components/_panel-spotlight.scss +0 -81
- data/_sass/components/_panel.scss +0 -300
- data/_sass/components/_table.scss +0 -81
- data/_sass/layout/_footer.scss +0 -49
- data/_sass/layout/_header.scss +0 -37
- data/_sass/layout/_page-wrapper.scss +0 -43
- data/_sass/layout/_wrapper.scss +0 -118
- data/assets/js/mapbox-gl.js +0 -40
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7cac4ccb50a2c237176745f4d120dc2edf954560ba572867a71abf99b098abf6
|
4
|
+
data.tar.gz: 7ee252ea2eb109cf6fef4c338daa72a054a122a4356efe6639e1c319c516ff12
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: feae88684c81c59aeec376fa0a32919e8f61906226fbc9cf34cc3a72451a2fee33170cb5c09ffe3dd5be2ea61906768507871d9f7e67a53d2c0329c4d24aac39
|
7
|
+
data.tar.gz: ecb7a2b8d62e3886276976ba2e7a520f7024509eb47436180d3c267ba56e428dc8b4a0658ba96f3a52fcc160beb83a0f3490d2dcfebfe5e7779f0f23b3ea367f
|
data/README.md
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
|
5
5
|
You can preview the theme [here](https://moodule.github.io/jekyll-theme-ethereal)
|
6
6
|
|
7
|
-
![Ethereal Theme](assets/images/screenshot.
|
7
|
+
![Ethereal Theme](assets/images/screenshot.webp "Ethereal Theme")
|
8
8
|
|
9
9
|
# Features
|
10
10
|
|
@@ -24,6 +24,8 @@ You can preview the theme [here](https://moodule.github.io/jekyll-theme-ethereal
|
|
24
24
|
|
25
25
|
> **Light**: svg images, thumbs and lazy loading for raster images, few libraries
|
26
26
|
|
27
|
+
> **Performant**: parallel loading & execution of assets, support lazy-loading, minified assets, compressed critical path
|
28
|
+
|
27
29
|
> **Hardened**: form validation, recaptcha, verified libraries
|
28
30
|
|
29
31
|
# Installation
|
@@ -80,6 +82,57 @@ The contact form is validated using [google's recaptcha plugin][recaptcha-docume
|
|
80
82
|
First, you need to [sign your website up] to enable the plugin.
|
81
83
|
Google will provide you with a **client-side integration key**: copy it to `_config.yml` under `recaptcha.sitekey`.
|
82
84
|
|
85
|
+
## Images
|
86
|
+
|
87
|
+
### Lazy-Loading
|
88
|
+
|
89
|
+
Images downloading & rendering can be defered until they enter the viewport.
|
90
|
+
This shortens the loading of the webpage, with no consequence on the displayed content since the images are off-screen.
|
91
|
+
|
92
|
+
There are 2 possibilities:
|
93
|
+
1) using the scripts bundled with the gem
|
94
|
+
2) depending on the browser
|
95
|
+
|
96
|
+
Browser support for lazy-loading is varying, so it is recommanded to opt for the first solution.
|
97
|
+
|
98
|
+
#### Using the gem functionality
|
99
|
+
|
100
|
+
- add `class="lazy-loading"`
|
101
|
+
- fill the attribute `src` with the path to the placeholder file
|
102
|
+
- fill the attribute `data-src` with the path to the content file
|
103
|
+
|
104
|
+
Before:
|
105
|
+
```html
|
106
|
+
<img src="{{ 'assets/images/content.jpg' | absolute_url }}" />
|
107
|
+
```
|
108
|
+
|
109
|
+
After:
|
110
|
+
```html
|
111
|
+
<img class="lazy-loading" src="{{ 'assets/images/placeholder.jpg' | absolute_url }}" data-src="{{ 'assets/images/content.jpg' | absolute_url }}" />
|
112
|
+
```
|
113
|
+
|
114
|
+
#### Using the browser functionality
|
115
|
+
|
116
|
+
- add `loading="lazy"`
|
117
|
+
|
118
|
+
Before:
|
119
|
+
```html
|
120
|
+
<img src="{{ 'assets/images/content.jpg' | absolute_url }}" />
|
121
|
+
```
|
122
|
+
|
123
|
+
After:
|
124
|
+
```html
|
125
|
+
<img loading="lazy" src="{{ 'assets/images/content.jpg' | absolute_url }}" />
|
126
|
+
```
|
127
|
+
|
128
|
+
> This functionality is not supported by all the browsers!
|
129
|
+
|
130
|
+
### Compression and file formats
|
131
|
+
|
132
|
+
It is recommanded to use the `webp` format.
|
133
|
+
|
134
|
+
At a given dimension and compression level (quality) the webp files are at least half the size with a smoother feel.
|
135
|
+
|
83
136
|
## Publication
|
84
137
|
|
85
138
|
### On Github Pages
|
data/_includes/contact_form.html
CHANGED
@@ -1,21 +1,25 @@
|
|
1
|
-
<form method="post" id="{{ include.form_id | 'contact-form' }}" action="
|
1
|
+
<form method="post" id="{{ include.form_id | default: 'contact-form' }}" action="javascript:void(0);" onsubmit="{{ include.onsubmit_callback | default: 'processContactRequest' }}()" onreset="{{ include.onreset_callback | default: 'resetContactForm' }}()" >
|
2
2
|
<div class="fields">
|
3
3
|
<div class="field half">
|
4
4
|
<label for="name">Name</label>
|
5
|
-
<input type="text" name="{{ include.name_input_id | 'contact-name' }}" id="{{ include.name_input_id | 'contact-name' }}" required minlength="4" maxlength="64" />
|
5
|
+
<input type="text" name="{{ include.name_input_id | default: 'contact-name' }}" id="{{ include.name_input_id | default: 'contact-name' }}" placeholder="John Doe" required minlength="4" maxlength="64" onfocusout="{{ include.onfocusout_callback | default: 'toggleSubmitInputElement' }}()" />
|
6
6
|
</div>
|
7
7
|
<div class="field half">
|
8
8
|
<label for="email">Email</label>
|
9
|
-
<input type="email" name="{{ include.email_input_id | 'contact-email' }}" id="{{ include.email_input_id | 'contact-email' }}" required minlength="8" maxlength="64" />
|
9
|
+
<input type="email" name="{{ include.email_input_id | default: 'contact-email' }}" id="{{ include.email_input_id | default: 'contact-email' }}" placeholder="john.doe@example.com" required minlength="8" maxlength="64" onfocusout="{{ include.onfocusout_callback | default: 'toggleSubmitInputElement' }}()" />
|
10
10
|
</div>
|
11
11
|
<div class="field">
|
12
12
|
<label for="message">Message</label>
|
13
|
-
<textarea name="{{ include.message_input_id | 'contact-message' }}" id="{{ include.message_input_id | 'contact-message' }}" rows="4"
|
13
|
+
<textarea name="{{ include.message_input_id | default: 'contact-message' }}" id="{{ include.message_input_id | default: 'contact-message' }}" placeholder="Please reach out!" rows="4" required minlength="16" maxlength="256" onfocusout="{{ include.onfocusout_callback | default: 'toggleSubmitInputElement' }}()" ></textarea>
|
14
14
|
</div>
|
15
15
|
</div>
|
16
16
|
<ul class="actions">
|
17
|
-
<li><
|
18
|
-
<li><input type="
|
19
|
-
<li><input type="reset" id="{{ include.reset_input_id | 'contact-reset-button' }}" value="Reset" class="icon button fa-undo" /></li>
|
17
|
+
<li><input type="submit" id="{{ include.submit_input_id | default: 'contact-submit-button' }}" value="Send Message" class="button primary fa-envelope" disabled /></li>
|
18
|
+
<li><input type="reset" id="{{ include.reset_input_id | default: 'contact-reset-button' }}" value="Reset" class="icon button fa-undo" /></li>
|
20
19
|
</ul>
|
20
|
+
<div id="modal-recaptcha-window" class="modal" tabIndex="-1">
|
21
|
+
<div class="inner">
|
22
|
+
<div id="{{ include.recaptcha_widget_id | default: 'recaptcha-checkbox' }}" ></div>
|
23
|
+
</div>
|
24
|
+
</div>
|
21
25
|
</form>
|
@@ -1,9 +1,10 @@
|
|
1
|
-
<script type="text/javascript">
|
1
|
+
<script type="text/javascript" >
|
2
2
|
const contactFormElement = document.getElementById("{{ include.form_id | default: 'contact-form' }}");
|
3
3
|
const nameInputElement = document.getElementById("{{ include.name_input_id | default: 'contact-name' }}");
|
4
4
|
const emailInputElement = document.getElementById("{{ include.email_input_id | default: 'contact-email' }}");
|
5
5
|
const messageInputElement = document.getElementById("{{ include.message_input_id | default: 'contact-message' }}");
|
6
6
|
const submitInputElement = document.getElementById("{{ include.submit_input_id | default: 'contact-submit-button' }}");
|
7
|
+
const modalWindowElement = document.getElementById("{{ include.modal_window_id | default: 'modal-recaptcha-window' }}");
|
7
8
|
var recaptchaWidget;
|
8
9
|
|
9
10
|
const isInputValid = function() {
|
@@ -11,42 +12,79 @@
|
|
11
12
|
&& emailInputElement.checkValidity()
|
12
13
|
&& messageInputElement.checkValidity())
|
13
14
|
};
|
14
|
-
|
15
|
-
const isRecaptchaValid = function() {
|
16
|
-
var responseToken = grecaptcha.getResponse(recaptchaWidget);
|
17
|
-
return true;
|
18
|
-
};
|
19
15
|
|
20
16
|
const disableSubmitInputElement = function (disabled = true) {
|
21
17
|
submitInputElement.disabled = disabled;
|
22
18
|
}
|
23
19
|
|
24
|
-
const {{ include.
|
20
|
+
const {{ include.onfocusout_callback | default: 'toggleSubmitInputElement' }} = function() {
|
21
|
+
if (isInputValid()) {
|
22
|
+
disableSubmitInputElement(false);
|
23
|
+
} else {
|
24
|
+
disableSubmitInputElement();
|
25
|
+
}
|
26
|
+
};
|
27
|
+
|
28
|
+
const showModalWindow = function() {
|
29
|
+
modalWindowElement.classList.add('visible');
|
30
|
+
modalWindowElement.classList.add('loaded');
|
31
|
+
modalWindowElement.focus();
|
32
|
+
}
|
33
|
+
|
34
|
+
const hideModalWindow = function() {
|
35
|
+
modalWindowElement.classList.remove('loaded');
|
36
|
+
modalWindowElement.classList.remove('visible');
|
37
|
+
contactFormElement.focus();
|
38
|
+
}
|
39
|
+
|
40
|
+
const {{ include.onsubmit_callback | default: 'processContactRequest' }} = function() {
|
41
|
+
if (grecaptcha.getResponse(recaptchaWidget).length > 0) {
|
42
|
+
sendContactMessage();
|
43
|
+
hideModalWindow();
|
44
|
+
resetContactForm();
|
45
|
+
grecaptcha.reset();
|
46
|
+
} else {
|
47
|
+
showModalWindow();
|
48
|
+
}
|
49
|
+
};
|
50
|
+
|
51
|
+
const {{ include.onreset_callback | default: 'resetContactForm' }} = function() {
|
25
52
|
contactFormElement.reset();
|
26
53
|
disableSubmitInputElement();
|
27
54
|
};
|
28
55
|
|
29
|
-
const
|
30
|
-
|
31
|
-
|
32
|
-
|
56
|
+
const sendContactMessage = function() {
|
57
|
+
const data = {
|
58
|
+
name: encodeURIComponent(nameInputElement.value),
|
59
|
+
email: encodeURIComponent(emailInputElement.value),
|
60
|
+
message: encodeURIComponent(messageInputElement),
|
61
|
+
token: grecaptcha.getResponse(recaptchaWidget)
|
62
|
+
};
|
63
|
+
|
64
|
+
fetch("{{ '/contact' | absolute_url }}", {
|
65
|
+
method: 'POST',
|
66
|
+
mode: 'same-origin',
|
67
|
+
headers: {'Content-Type': 'application/json',},
|
68
|
+
body: JSON.stringify(data),
|
69
|
+
})
|
70
|
+
.then((response) => {
|
71
|
+
alert('Message sent!');
|
72
|
+
})
|
73
|
+
.catch((error) => {
|
74
|
+
console.error('Error:', error);
|
75
|
+
});
|
33
76
|
};
|
34
77
|
|
35
78
|
var onloadCallback = function() {
|
36
|
-
|
37
|
-
if (isInputValid() && isRecaptchaValid()) {
|
38
|
-
disableSubmitInputElement(false);
|
39
|
-
} else {
|
40
|
-
disableSubmitInputElement();
|
41
|
-
}
|
42
|
-
};
|
43
|
-
recaptchaWidget = grecaptcha.render('{{ include.recaptcha_widget_id | 'recaptcha-checkbox' }}', {
|
79
|
+
recaptchaWidget = grecaptcha.render('{{ include.recaptcha_widget_id | default: 'recaptcha-checkbox' }}', {
|
44
80
|
'sitekey' : '{{ site.recaptcha.sitekey }}',
|
45
81
|
'theme' : 'dark',
|
46
|
-
'
|
47
|
-
'
|
48
|
-
'size' : 'compact'
|
82
|
+
'size' : 'compact',
|
83
|
+
'callback' : processContactRequest
|
49
84
|
});
|
50
85
|
};
|
86
|
+
|
87
|
+
modalWindowElement.addEventListener('click', hideModalWindow);
|
88
|
+
modalWindowElement.addEventListener('keyup', hideModalWindow);
|
51
89
|
</script>
|
52
90
|
<script src="https://www.google.com/recaptcha/api.js?onload=onloadCallback&render=explicit" async defer></script>
|
data/_includes/head.html
CHANGED
@@ -4,7 +4,14 @@
|
|
4
4
|
<title>{{ include.title }} - {{ include.subtitle }}</title>
|
5
5
|
<meta charset="utf-8" />
|
6
6
|
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
|
7
|
-
<link rel="stylesheet" href="{{ 'assets/css/main.css' | absolute_url }}" />
|
7
|
+
<link rel="stylesheet" href="{{ 'assets/css/main.css' | absolute_url }}" media="all" />
|
8
|
+
<link rel="stylesheet" href="{{ 'assets/css/large.css' | absolute_url }}" media="screen and (min-width: 981px)" />
|
9
|
+
<link rel="stylesheet" href="{{ 'assets/css/medium.css' | absolute_url }}" media="screen and (min-width: 737px) and (max-width:980px)" />
|
10
|
+
<link rel="stylesheet" href="{{ 'assets/css/small.css' | absolute_url }}" media="screen and (max-width:736px)" />
|
11
|
+
<link rel="stylesheet" href="{{ 'assets/css/short.css' | absolute_url }}" media="screen and (min-aspect-ratio:16/7)" />
|
12
|
+
<link rel="preload" href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,300i,400i&display=swap" as="style" onload="this.onload=null;this.rel='stylesheet';this.media='all'">
|
13
|
+
<link rel="preload" href="{{ 'assets/css/fontawesome-all.min.css' | absolute_url }}" as="style" onload="this.onload=null;this.rel='stylesheet';this.media='all'">
|
14
|
+
<link rel="preload" href="{{ 'assets/css/cookieconsent.min.css' | absolute_url }}" as="style" onload="this.onload=null;this.rel='stylesheet';this.media='all'">
|
8
15
|
{%- if include.stylesheets -%}
|
9
16
|
{%- for file in include.stylesheets -%}
|
10
17
|
<link rel="stylesheet" href="{{ file.url | absolute_url }}" />
|
@@ -17,5 +24,8 @@
|
|
17
24
|
<link rel="icon" href="{{ site.favicon | absolute_url }}" />
|
18
25
|
{%- endif -%}
|
19
26
|
<noscript><link rel="stylesheet" href="{{ 'assets/css/noscript.css' | absolute_url }}" /></noscript>
|
27
|
+
<noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,300i,400i&display=swap" /></noscript>
|
28
|
+
<noscript><link rel="stylesheet" href="{{ 'assets/css/fontawesome-all.min.css' | absolute_url }}" /></noscript>
|
29
|
+
<noscript><link rel="stylesheet" href="{{ 'assets/css/cookieconsent.min.css' | absolute_url }}" /></noscript>
|
20
30
|
{% seo %}
|
21
31
|
</head>
|
@@ -5,19 +5,19 @@
|
|
5
5
|
{%- assign submit_input_id="contact-submit-button" -%}
|
6
6
|
{%- assign reset_input_id="contact-reset-button" -%}
|
7
7
|
{%- assign recaptcha_widget_id="recaptcha-checkbox" -%}
|
8
|
-
{%- assign onsubmit_callback="
|
8
|
+
{%- assign onsubmit_callback="processContactRequest" -%}
|
9
9
|
{%- assign onreset_callback="resetContactForm" -%}
|
10
|
-
|
10
|
+
{%- assign onfocusout_callback="toggleSubmitInputElement" -%}
|
11
11
|
<div class="intro {{ include.style.header.color | default: 'color4' }}">
|
12
12
|
<h2 class="major">{{ include.header.title | default: 'Contact'}}</h2>
|
13
13
|
<p>{{ include.header.description }}</p>
|
14
14
|
</div>
|
15
15
|
<div class="inner columns divided">
|
16
16
|
<div class="span-3-25">
|
17
|
-
{% include contact_form.html form_id=form_id name_input_id=name_input_id email_input_id=email_input_id message_input_id=message_input_id submit_input_id=submit_input_id reset_input_id=reset_input_id recaptcha_widget_id=recaptcha_widget_id onsubmit_callback=onsubmit_callback onreset_callback=onreset_callback %}
|
17
|
+
{% include contact_form.html form_id=form_id name_input_id=name_input_id email_input_id=email_input_id message_input_id=message_input_id submit_input_id=submit_input_id reset_input_id=reset_input_id recaptcha_widget_id=recaptcha_widget_id onsubmit_callback=onsubmit_callback onreset_callback=onreset_callback onfocusout_callback=onfocusout_callback %}
|
18
18
|
</div>
|
19
19
|
<div class="span-1-5">
|
20
20
|
{% include social.html color=include.style.icons.color %}
|
21
21
|
</div>
|
22
22
|
</div>
|
23
|
-
{% include contact_script.html form_id=form_id name_input_id=name_input_id email_input_id=email_input_id message_input_id=message_input_id submit_input_id=submit_input_id reset_input_id=reset_input_id recaptcha_widget_id=recaptcha_widget_id onsubmit_callback=onsubmit_callback onreset_callback=onreset_callback %}
|
23
|
+
{% include contact_script.html form_id=form_id name_input_id=name_input_id email_input_id=email_input_id message_input_id=message_input_id submit_input_id=submit_input_id reset_input_id=reset_input_id recaptcha_widget_id=recaptcha_widget_id onsubmit_callback=onsubmit_callback onreset_callback=onreset_callback onfocusout_callback=onfocusout_callback %}
|
data/_includes/panel_map.html
CHANGED
@@ -1,111 +1,85 @@
|
|
1
|
-
<link rel="stylesheet" href="{{ 'assets/css/mapbox-gl.css' | absolute_url }}"
|
2
|
-
<
|
3
|
-
body { margin: 0; padding: 0; }
|
4
|
-
#map-container { position: relative; top: 0; bottom: 0; width: 100%; };
|
5
|
-
|
6
|
-
#marker {
|
7
|
-
background-size: cover;
|
8
|
-
width: 50px;
|
9
|
-
height: 50px;
|
10
|
-
border-radius: 50%;
|
11
|
-
cursor: pointer;
|
12
|
-
}
|
13
|
-
|
14
|
-
.mapboxgl-popup {
|
15
|
-
max-width: 240px;
|
16
|
-
}
|
17
|
-
|
18
|
-
.mapboxgl-popup-close-button {
|
19
|
-
display: none;
|
20
|
-
}
|
21
|
-
|
22
|
-
.mapboxgl-popup-content {
|
23
|
-
color: #000000;
|
24
|
-
max-width: 220px;
|
25
|
-
}
|
26
|
-
|
27
|
-
.mapboxgl-popup-content-wrapper {
|
28
|
-
padding: 1%;
|
29
|
-
}
|
30
|
-
</style>
|
1
|
+
<link rel="stylesheet" href="{{ 'assets/css/mapbox-gl.min.css' | absolute_url }}" media="all">
|
2
|
+
<link rel="stylesheet" href="{{ 'assets/css/mapbox-gl.panel.min.css' | absolute_url }}" media="all">
|
31
3
|
<div class="intro {{ include.style.header.joined }} {{ include.style.header.color }}">
|
32
4
|
<h2 class="major">{{ include.header.title }}</h2>
|
33
5
|
<p>{{ include.header.description }}</p>
|
34
6
|
</div>
|
35
7
|
<div id='map-container'></div>
|
36
|
-
<script
|
37
|
-
<script defer>
|
38
|
-
mapboxgl.accessToken = "{{ include.data.token }}";
|
39
|
-
var map = new mapboxgl.Map({
|
40
|
-
container: "map-container",
|
41
|
-
style: "{{ include.data.style }}",
|
42
|
-
center: [{{ include.data.center.longitude | default: 0.0 }}, {{ include.data.center.latitude | default: 0.0 }}],
|
43
|
-
zoom: {{ include.data.zoom | default: 1 }},
|
44
|
-
dragPan: true
|
45
|
-
});
|
46
|
-
|
8
|
+
<script>
|
47
9
|
var data_points;
|
48
|
-
fetch("{{ include.data.file | absolute_url }}")
|
49
|
-
.then(response => data_points = response.json())
|
50
|
-
.then(json => data_points = json);
|
51
10
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
},
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
"icon-image": ["concat", ["get", "icon"], "-15"],
|
65
|
-
"icon-size": 1,
|
66
|
-
"icon-allow-overlap": true,
|
67
|
-
// get the title name from the source's "title" property
|
68
|
-
"text-field": ["get", "{{ include.data.markers.title | default: 'name' }}"],
|
69
|
-
"text-font": ["Open Sans Semibold", "Arial Unicode MS Bold"],
|
70
|
-
"text-offset": [0, 0.6],
|
71
|
-
"text-anchor": "top"
|
72
|
-
},
|
73
|
-
"paint": {
|
74
|
-
"icon-color": "#ffcc00",
|
75
|
-
"icon-halo-color": "#2266AA",
|
76
|
-
"text-color": "#ffffff"
|
77
|
-
}
|
11
|
+
function fillMapContainer() {
|
12
|
+
fetch("{{ include.data.file | absolute_url }}")
|
13
|
+
.then(response => response.json())
|
14
|
+
.then(json => data_points = json);
|
15
|
+
|
16
|
+
mapboxgl.accessToken = "{{ include.data.token }}";
|
17
|
+
var map = new mapboxgl.Map({
|
18
|
+
container: "map-container",
|
19
|
+
style: "{{ include.data.style }}",
|
20
|
+
center: [{{ include.data.center.longitude | default: 0.0 }}, {{ include.data.center.latitude | default: 0.0 }}],
|
21
|
+
zoom: {{ include.data.zoom | default: 1 }},
|
22
|
+
dragPan: true
|
78
23
|
});
|
79
24
|
|
80
|
-
|
25
|
+
map.on('load', function () {
|
81
26
|
|
27
|
+
map.addLayer({
|
28
|
+
"id": "points",
|
29
|
+
"type": "symbol",
|
30
|
+
"source": {
|
31
|
+
"type": "geojson",
|
32
|
+
"data": data_points
|
33
|
+
},
|
34
|
+
"layout": {
|
35
|
+
// get the icon name from the source's "icon" property
|
36
|
+
// concatenate the name to get an icon from the style's sprite sheet
|
37
|
+
"icon-image": ["concat", ["get", "icon"], "-15"],
|
38
|
+
"icon-size": 1,
|
39
|
+
"icon-allow-overlap": true,
|
40
|
+
// get the title name from the source's "title" property
|
41
|
+
"text-field": ["get", "{{ include.data.markers.title | default: 'name' }}"],
|
42
|
+
"text-font": ["Open Sans Semibold", "Arial Unicode MS Bold"],
|
43
|
+
"text-offset": [0, 0.6],
|
44
|
+
"text-anchor": "top"
|
45
|
+
},
|
46
|
+
"paint": {
|
47
|
+
"icon-color": "#ffcc00",
|
48
|
+
"icon-halo-color": "#2266AA",
|
49
|
+
"text-color": "#ffffff"
|
50
|
+
}
|
51
|
+
});
|
82
52
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
.
|
99
|
-
|
100
|
-
|
101
|
-
|
53
|
+
});
|
54
|
+
|
55
|
+
// When a click event occurs on a feature in the places layer, open a popup at the
|
56
|
+
// location of the feature, with description HTML from its properties.
|
57
|
+
map.on('click', 'points', function(e) {
|
58
|
+
var coordinates = e.features[0].geometry.coordinates.slice();
|
59
|
+
var description = e.features[0].properties.{{ include.data.markers.popup.text }};
|
60
|
+
|
61
|
+
// Ensure that if the map is zoomed out such that multiple
|
62
|
+
// copies of the feature are visible, the popup appears
|
63
|
+
// over the copy being pointed to.
|
64
|
+
while (Math.abs(e.lngLat.lng - coordinates[0]) > 180) {
|
65
|
+
coordinates[0] += e.lngLat.lng > coordinates[0] ? 360 : -360;
|
66
|
+
}
|
67
|
+
|
68
|
+
new mapboxgl.Popup()
|
69
|
+
.setLngLat(coordinates)
|
70
|
+
.setHTML(description)
|
71
|
+
.addTo(map);
|
72
|
+
});
|
73
|
+
|
102
74
|
// Change the cursor to a pointer when the mouse is over the places layer.
|
103
|
-
map.on('mouseenter', 'points', function() {
|
104
|
-
|
105
|
-
});
|
106
|
-
|
75
|
+
map.on('mouseenter', 'points', function() {
|
76
|
+
map.getCanvas().style.cursor = 'pointer';
|
77
|
+
});
|
78
|
+
|
107
79
|
// Change it back to a pointer when it leaves.
|
108
|
-
map.on('mouseleave', 'points', function() {
|
109
|
-
|
110
|
-
});
|
80
|
+
map.on('mouseleave', 'points', function() {
|
81
|
+
map.getCanvas().style.cursor = '';
|
82
|
+
});
|
83
|
+
}
|
111
84
|
</script>
|
85
|
+
<script src="{{ 'assets/js/mapbox-gl.min.js' | absolute_url }}" onload="fillMapContainer()" defer ></script>
|