arco 0.4.3 → 0.6.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6cf35d196050f4bd10853f6114f8c6721116967ffb6ee675a2af18f82759374f
4
- data.tar.gz: 6c1dad515a172985ae475af3df05260633c784ca213e22cc965eefc583f4a756
3
+ metadata.gz: ed3afabbd0f0d5eb50c6d5dc2eb291efc093a4bfff6b2bd9d24bb86e2104c8c5
4
+ data.tar.gz: 25e40f782d66b71d7aec51e1c3a3d45ce67c919621fc8872b2219479ff172fb3
5
5
  SHA512:
6
- metadata.gz: e82d454f28a27de909cde6319a6af6b101d0c36917685a0ffe5ffc8da0244cdddaf18448fd8a998c26d437e5708f106dfc3755d3fa84023683a78a0b8cdcee9e
7
- data.tar.gz: dfb34396c18c33ffb6f5ab54441e88b6ba8adb13c2da1e0fe20522f61f0ee1e085b87f7531cd3fed1c055cf0e7cab445e888c39157a2ba557838637c7c87c030
6
+ metadata.gz: 28544ffe6094e042a600389c647e628dbca4a92da8ac1ba1027dace5b4aa9b1c3e92e58c36346df07da315dc401b4a899d1c0fe3990a39c79e846f0c3953029b
7
+ data.tar.gz: f01d4e8da0622fddedd6e4d414744cee5936a2cd519f06827cc96991a8988c61d8d0064c655bdc0c2064ed1a0011a5a4a0dcf9097602535cd53680701877ec91
data/README.md CHANGED
@@ -80,12 +80,36 @@ title: Post title
80
80
  description: Post description
81
81
  category: completed | ongoing
82
82
  permalink: /projects/post-title
83
+ source-url: https://project.source/link/
83
84
  cover-image: /assets/image-for-front-page.png
84
85
  image: /assets/image-for-top-of-post.png
86
+ tags: [tags, which, relate, to, post]
85
87
  mathjax: true | false
86
88
  ---
87
89
  ```
88
90
 
91
+ ### Favicon
92
+
93
+ Simply add your favicon `favicon.png` to the root of your site.
94
+
95
+ ### Lazy loading
96
+
97
+ In order to enable lazy loading on an image you must add a `data-echo` attribute like so:
98
+
99
+ ```html
100
+ <img src="/assets/placeholder-for-image.png" alt="alt-text" data-echo="/assets/actual-image.png" />
101
+ ```
102
+
103
+ ### Image lightbox
104
+
105
+ In order to open an image in a fullscreen lightbox on click, you must wrap the image in a link tag like so:
106
+
107
+ ```html
108
+ <a href="/assets/actual-image.png">
109
+ <img src="/assets/placeholder-for-image.png" alt="alt-text" data-echo="/assets/actual-image.png" />
110
+ </a>
111
+ ```
112
+
89
113
  ### Markdown features
90
114
 
91
115
  [Check here](https://meebuhs.github.io/projects/arco) for examples of the supported markdown features.
@@ -1,6 +1,6 @@
1
1
  <section class="cover">
2
2
  <div class="cover-text">
3
- {% if site.image %}<img class="site-image" src="{{ site.image }}" />{% endif %}
3
+ {% if site.image %}<img class="cover-image" src="{{ site.image }}" />{% endif %}
4
4
  <h1>{{ site.title }}</a></h1>
5
5
  <h6>{{ site.description }}</h6>
6
6
  </div>
@@ -0,0 +1,146 @@
1
+ <script>
2
+ (function (root, factory) {
3
+ if (typeof define === 'function' && define.amd) {
4
+ define(function() {
5
+ return factory(root);
6
+ });
7
+ } else if (typeof exports === 'object') {
8
+ module.exports = factory;
9
+ } else {
10
+ root.echo = factory(root);
11
+ }
12
+ })(this, function (root) {
13
+
14
+ 'use strict';
15
+
16
+ var echo = {};
17
+
18
+ var callback = function () {};
19
+
20
+ var offset, poll, delay, useDebounce, unload;
21
+
22
+ var isHidden = function (element) {
23
+ return (element.offsetParent === null);
24
+ };
25
+
26
+ var inView = function (element, view) {
27
+ if (isHidden(element)) {
28
+ return false;
29
+ }
30
+
31
+ var box = element.getBoundingClientRect();
32
+ return (box.right >= view.l && box.bottom >= view.t && box.left <= view.r && box.top <= view.b);
33
+ };
34
+
35
+ var debounceOrThrottle = function () {
36
+ if(!useDebounce && !!poll) {
37
+ return;
38
+ }
39
+ clearTimeout(poll);
40
+ poll = setTimeout(function(){
41
+ echo.render();
42
+ poll = null;
43
+ }, delay);
44
+ };
45
+
46
+ echo.init = function (opts) {
47
+ opts = opts || {};
48
+ var offsetAll = opts.offset || 0;
49
+ var offsetVertical = opts.offsetVertical || offsetAll;
50
+ var offsetHorizontal = opts.offsetHorizontal || offsetAll;
51
+ var optionToInt = function (opt, fallback) {
52
+ return parseInt(opt || fallback, 10);
53
+ };
54
+ offset = {
55
+ t: optionToInt(opts.offsetTop, offsetVertical),
56
+ b: optionToInt(opts.offsetBottom, offsetVertical),
57
+ l: optionToInt(opts.offsetLeft, offsetHorizontal),
58
+ r: optionToInt(opts.offsetRight, offsetHorizontal)
59
+ };
60
+ delay = optionToInt(opts.throttle, 250);
61
+ useDebounce = opts.debounce !== false;
62
+ unload = !!opts.unload;
63
+ callback = opts.callback || callback;
64
+ echo.render();
65
+ if (document.addEventListener) {
66
+ root.addEventListener('scroll', debounceOrThrottle, false);
67
+ root.addEventListener('load', debounceOrThrottle, false);
68
+ } else {
69
+ root.attachEvent('onscroll', debounceOrThrottle);
70
+ root.attachEvent('onload', debounceOrThrottle);
71
+ }
72
+ };
73
+
74
+ echo.render = function (context) {
75
+ var nodes = (context || document).querySelectorAll('[data-echo], [data-echo-background]');
76
+ var length = nodes.length;
77
+ var src, elem;
78
+ var view = {
79
+ l: 0 - offset.l,
80
+ t: 0 - offset.t,
81
+ b: (root.innerHeight || document.documentElement.clientHeight) + offset.b,
82
+ r: (root.innerWidth || document.documentElement.clientWidth) + offset.r
83
+ };
84
+ for (var i = 0; i < length; i++) {
85
+ elem = nodes[i];
86
+ if (inView(elem, view)) {
87
+
88
+ if (unload) {
89
+ elem.setAttribute('data-echo-placeholder', elem.src);
90
+ }
91
+
92
+ if (elem.getAttribute('data-echo-background') !== null) {
93
+ elem.style.backgroundImage = 'url(' + elem.getAttribute('data-echo-background') + ')';
94
+ }
95
+ else if (elem.src !== (src = elem.getAttribute('data-echo'))) {
96
+ elem.src = src;
97
+ }
98
+
99
+ if (!unload) {
100
+ elem.removeAttribute('data-echo');
101
+ elem.removeAttribute('data-echo-background');
102
+ }
103
+
104
+ callback(elem, 'load');
105
+ }
106
+ else if (unload && !!(src = elem.getAttribute('data-echo-placeholder'))) {
107
+
108
+ if (elem.getAttribute('data-echo-background') !== null) {
109
+ elem.style.backgroundImage = 'url(' + src + ')';
110
+ }
111
+ else {
112
+ elem.src = src;
113
+ }
114
+
115
+ elem.removeAttribute('data-echo-placeholder');
116
+ callback(elem, 'unload');
117
+ }
118
+ }
119
+ if (!length) {
120
+ echo.detach();
121
+ }
122
+ };
123
+
124
+ echo.detach = function () {
125
+ if (document.removeEventListener) {
126
+ root.removeEventListener('scroll', debounceOrThrottle);
127
+ } else {
128
+ root.detachEvent('onscroll', debounceOrThrottle);
129
+ }
130
+ clearTimeout(poll);
131
+ };
132
+
133
+ return echo;
134
+
135
+ });
136
+ </script>
137
+ <script>
138
+ echo.init({
139
+ offset: 2500,
140
+ throttle: 250,
141
+ unload: false,
142
+ callback: function (element, op) {
143
+ //console.log(element, 'has been', op + 'ed')
144
+ }
145
+ });
146
+ </script>
@@ -10,7 +10,7 @@
10
10
  <script
11
11
  type="text/javascript"
12
12
  charset="utf-8"
13
- src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"
13
+ src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.7/MathJax.js?config=TeX-AMS-MML_HTMLorMML"
14
14
  >
15
15
  </script>
16
16
  <script
@@ -1,23 +1,33 @@
1
1
  <section id="sidebar" class="sidebar">
2
2
  <svg id="sidebar-fader"></svg>
3
- <div class="sidebar-text">
4
- {% if site.image %}<img class="site-image" src="{{ site.image }}" />{% endif %}
5
- <h1><a href="{{ "/projects/" }}" class="fade-onclick">{{ site.title }}</a></h1>
6
- <h6>{{ site.description }}</h6>
3
+ <div class="sidebar-header">
4
+ {% if site.image %}
5
+ <div class="sidebar-image-container">
6
+ <img class="sidebar-image" src="{{ site.image }}" />
7
+ </div>
8
+ {% endif %}
9
+ <div class="sidebar-text">
10
+ <h1><a href="{{ "/projects/" }}" class="fade-onclick">{{ site.title }}</a></h1>
11
+ <h6>{{ site.description }}</h6>
12
+ </div>
7
13
  </div>
8
14
  <div class="sidebar-links">
9
- {% assign identifier = page.url | split: "/" | last %}
10
- {% if identifier == "completed" %}
11
- completed
12
- {% else %}
13
- <a href="{{ "/projects/completed" }}" class="fade-onclick">completed</a>
14
- {% endif %}
15
- /
16
- {% if identifier == "ongoing" %}
17
- ongoing
18
- {% else %}
19
- <a href="{{ "/projects/ongoing" }}" class="fade-onclick">ongoing</a>
20
- {% endif %}
21
- {% if site.github_url %} / <a href="{{ site.github_url }}">github</a> {% endif %}{% if site.resume %} / <a href="{{ "/resume" }}" class="fade-onclick">resume</a> {% endif %}
15
+ <div class="sidebar-links-top">
16
+ {% assign identifier = page.url | split: "/" | last %}
17
+ {% if identifier == "completed" %}
18
+ completed
19
+ {% else %}
20
+ <a href="{{ "/projects/completed" }}" class="fade-onclick">completed</a>
21
+ {% endif %}
22
+ /
23
+ {% if identifier == "ongoing" %}
24
+ ongoing
25
+ {% else %}
26
+ <a href="{{ "/projects/ongoing" }}" class="fade-onclick">ongoing</a>
27
+ {% endif %}
28
+ </div>
29
+ <div class="sidebar-links-bottom">
30
+ {% if site.github_url %} <a href="{{ site.github_url }}">github</a> / {% endif %}{% if site.resume %}<a href="{{ "/resume" }}" class="fade-onclick">resume</a> {% endif %}
31
+ </div>
22
32
  </div>
23
33
  </section>
@@ -2,6 +2,7 @@
2
2
  <html lang="en-AU">
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
+ <link rel="shortcut icon" type="image/png" href="favicon.png?">
5
6
  <link rel="stylesheet" href="/assets/css/main.css">
6
7
  </head>
7
8
  <body>
@@ -2,6 +2,7 @@
2
2
  <html lang="en-AU">
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
+ <link rel="shortcut icon" type="image/png" href="favicon.png?">
5
6
  <link rel="stylesheet" href="/assets/css/main.css">
6
7
  <link rel="stylesheet" href="/assets/flexmasonry/flexmasonry.css">
7
8
  <script src="/assets/flexmasonry/flexmasonry.js"></script>
@@ -10,8 +11,11 @@
10
11
  <body>
11
12
  {% include sidebar.html %}
12
13
  {{ content }}
14
+ {% include lazyload.html %}
15
+ <script type="text/javascript" src="/assets/lightbox/lightbox.js"></script>
16
+ <link rel="stylesheet" href="/assets/lightbox/lightbox.css">
17
+ <script src="/assets/js/sidebar.js"></script>
18
+ <script src="/assets/js/fade-transitions.js"></script>
19
+ <script>fadeInPage();</script>
13
20
  </body>
14
- <script src="/assets/js/sidebar.js"></script>
15
- <script src="/assets/js/fade-transitions.js"></script>
16
- <script>fadeInPage();</script>
17
21
  </html>
@@ -2,6 +2,7 @@
2
2
  <html lang="en-AU">
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
+ <link rel="shortcut icon" type="image/png" href="favicon.png?">
5
6
  <link rel="stylesheet" href="/assets/css/main.css">
6
7
  {% seo %}
7
8
  </head>
@@ -21,6 +21,9 @@ layout: default
21
21
  <span class="list-post-date">{{ post.date | date_to_string}}</span>
22
22
  &middot;
23
23
  <a href="{{ "/projects/" }}{{ post.category }}" class="fade-onclick"><span class="list-post-category">{{ post.category }}</span></a>
24
+ <div class="list-post-tags">
25
+ {{ post.tags | join: ", "}}
26
+ </div>
24
27
  </div>
25
28
  </div>
26
29
  {% endfor %}
@@ -9,6 +9,13 @@ layout: default
9
9
  <section class="content">
10
10
  <svg id="content-fader"></svg>
11
11
  <div class="post">
12
+ <div class="post-buttons">
13
+ <a href="{{ site.url }}\projects\" class="button-light-secondary">Home</a>
14
+ {% if page.source-url %}
15
+ <a href="{{ page.source-url }}" class="button-light-tertiary">See the source</a>
16
+ {% endif %}
17
+ </div>
18
+
12
19
  <div class="post-title"><h1>{{ page.title }}</h1></div>
13
20
  <div class="post-description">{{ page.description }}</div>
14
21
  <div class="post-header">
@@ -16,11 +23,20 @@ layout: default
16
23
  &middot;
17
24
  <a href="{{ "/projects/" }}{{ page.category }}" class="fade-onclick"><span class="post-category">{{ page.category }}</span></a>
18
25
  </div>
19
- <img class="post-image" src="{{ page.image }}" />
26
+ <a href="{{ page.image }}">
27
+ <img class="post-image" alt="{{ page.title }} | {{ page.description | truncate: 80 }}" src="{{ page.image }}" />
28
+ </a>
20
29
 
21
30
  <div class="post-content">
22
31
  {{ content }}
23
32
  </div>
33
+
34
+ <div class="post-buttons">
35
+ <a href="{{ site.url }}\projects\" class="button-light-secondary">Home</a>
36
+ {% if page.source-url %}
37
+ <a href="{{ page.source-url }}" class="button-light-tertiary">See the source </></a>
38
+ {% endif %}
39
+ </div>
24
40
  </div>
25
41
  {% include footer.html %}
26
42
  </section>
@@ -8,7 +8,6 @@
8
8
  }
9
9
  h6 {
10
10
  text-transform: uppercase;
11
- font-size: .9rem;
12
11
  color: $text-colour-light;
13
12
  }
14
13
  }
@@ -125,11 +125,6 @@ li, ul {
125
125
  line-height: 1.5em;
126
126
  }
127
127
 
128
- .site-image {
129
- width: 200px;
130
- border-radius: 50%;
131
- }
132
-
133
128
  .content {
134
129
  width: auto;
135
130
  height: auto;
@@ -8,6 +8,7 @@
8
8
  border: 2px solid $background;
9
9
  background-color: $background;
10
10
  color: $highlight;
11
+ font-weight: bold;
11
12
  &:hover, &:focus {
12
13
  background-color: $highlight;
13
14
  color: $background;
@@ -8,7 +8,6 @@
8
8
  }
9
9
  h6 {
10
10
  text-transform: uppercase;
11
- font-size: .9rem;
12
11
  color: $text-colour-light;
13
12
  }
14
13
  a {
@@ -40,3 +39,9 @@
40
39
  text-align: center;
41
40
  justify-content: center;
42
41
  }
42
+
43
+ .cover-image {
44
+ width: 200px;
45
+ height: 200px;
46
+ border-radius: 50%;
47
+ }
@@ -30,7 +30,7 @@
30
30
  .list-post-title {
31
31
  color: $text-colour-dark;
32
32
  width: 100%;
33
- font-size: 18px;
33
+ font-size: 1.5em;
34
34
  font-weight: bold;
35
35
  a {
36
36
  color: white;
@@ -43,7 +43,7 @@
43
43
  .list-post-summary {
44
44
  color: $summary-colour;
45
45
  margin: 0.4em 0;
46
- font-size: 16px;
46
+ font-size: 1em;
47
47
  }
48
48
 
49
49
  .list-post-footer {
@@ -53,14 +53,21 @@
53
53
  .list-post-date {
54
54
  color: $secondary-highlight;
55
55
  font-weight: bold;
56
- font-size: 14px;
56
+ font-size: 0.9em;
57
57
  }
58
58
 
59
59
  .list-post-category {
60
60
  font-weight: bold;
61
- font-size: 14px;
61
+ font-size: 0.9em;
62
62
  color: $primary-highlight;
63
63
  &:hover, &:focus {
64
64
  color: lighten($primary-highlight, 14%);
65
65
  }
66
+ }
67
+
68
+ .list-post-tags {
69
+ font-weight: bold;
70
+ font-size: 0.9em;
71
+ color: $tertiary-highlight;
72
+ margin-top: 0.4em;
66
73
  }
@@ -4,7 +4,7 @@
4
4
  }
5
5
 
6
6
  .post-title h1 {
7
- margin-bottom: 0;
7
+ margin: 1.5em 0 0 0;
8
8
  }
9
9
 
10
10
  .post-description {
@@ -14,7 +14,7 @@
14
14
  .post-date {
15
15
  color: $secondary-highlight;
16
16
  font-weight: bold;
17
- font-size: 14px;
17
+ font-size: 0.9em;
18
18
  }
19
19
 
20
20
  .post-image {
@@ -26,13 +26,17 @@
26
26
 
27
27
  .post-category {
28
28
  font-weight: bold;
29
- font-size: 14px;
29
+ font-size: 0.9em;
30
30
  color: $primary-highlight;
31
31
  &:hover, &:focus {
32
32
  color: lighten($primary-highlight, 14%);
33
33
  }
34
34
  }
35
35
 
36
+ .post-content {
37
+ margin-bottom: 2em;
38
+ }
39
+
36
40
  .post-content img {
37
41
  max-width: 90%;
38
42
  max-height: 600px;
@@ -10,7 +10,6 @@
10
10
  }
11
11
  h6 {
12
12
  text-transform: uppercase;
13
- font-size: .9rem;
14
13
  color: $text-colour-light;
15
14
  }
16
15
  a {
@@ -32,11 +31,10 @@
32
31
  transition: all .35s ease;
33
32
  }
34
33
 
35
- /* portrait layout */
36
- @media only screen and (max-width: 768px), (orientation: portrait) {
34
+ @media only screen and (orientation: portrait) {
37
35
  #sidebar {
38
36
  flex-direction: row;
39
- justify-content: space-evenly;
37
+ justify-content: space-between;
40
38
  align-items: center;
41
39
  text-align: center;
42
40
  }
@@ -51,9 +49,37 @@
51
49
  height: $sidebar-height-min;
52
50
  }
53
51
 
54
- .sidebar-text {
52
+ .sidebar-header {
55
53
  display: flex;
56
- flex-direction: column;
54
+ margin-left: 1em;
55
+ }
56
+
57
+ .sidebar-image-container {
58
+ margin-right: 1em;
59
+ }
60
+
61
+ .sidebar-image {
62
+ width: 80px;
63
+ height: 80px;
64
+ border-radius: 50%;
65
+ }
66
+
67
+ .sidebar-text {
68
+ h1 {
69
+ font-size: 2.5em;
70
+ margin-top: -0.3em;
71
+ }
72
+ h6 {
73
+ font-size: 1.3em;
74
+ margin: 0;
75
+ }
76
+ text-align: start;
77
+ }
78
+
79
+ .sidebar-links {
80
+ font-size: 1.5em;
81
+ margin-right: 1em;
82
+ text-align: end;
57
83
  }
58
84
 
59
85
  .content {
@@ -94,8 +120,7 @@
94
120
  }
95
121
  }
96
122
 
97
- /* landscape layout */
98
- @media only screen and (min-width: 768px), (orientation: landscape) {
123
+ @media only screen and (orientation: landscape) {
99
124
  #sidebar {
100
125
  flex-direction: column;
101
126
  text-align: center;
@@ -106,6 +131,12 @@
106
131
  width: $sidebar-width;
107
132
  height: 100%;
108
133
  }
134
+
135
+ .sidebar-image {
136
+ width: 200px;
137
+ height: 200px;
138
+ border-radius: 50%;
139
+ }
109
140
 
110
141
  .content {
111
142
  flex: 1;
@@ -3,9 +3,8 @@
3
3
  pre, code {
4
4
  font-family: "Roboto Mono";
5
5
  color: #cccccc;
6
- font-size: 0.9em;
6
+ font-size: 1em;
7
7
  background-color: #f8f8f8;
8
- font-size: 14px;
9
8
  }
10
9
 
11
10
  code {
@@ -0,0 +1,94 @@
1
+ #lightbox {width: 100%; height: 100%; position: fixed; top: 0; left: 0; background: rgba(0,0,0,0.85); z-index: 9999999; line-height: 0; cursor: pointer; display: none;}
2
+ #lightbox .img {
3
+ position: relative;
4
+ top: 50%;
5
+ left: 50%;
6
+ -ms-transform: translateX(-50%) translateY(-50%);
7
+ -webkit-transform: translate(-50%,-50%);
8
+ transform: translate(-50%,-50%);
9
+ max-width: 100%;
10
+ max-height: 100%;
11
+ }
12
+ #lightbox .img img {opacity: 0; pointer-events: none; width: auto;}
13
+ @media screen and (min-width: 1200px) {
14
+ #lightbox .img {
15
+ max-width: 1200px;
16
+ }
17
+ }
18
+ @media screen and (min-height: 1200px) {
19
+ #lightbox .img {
20
+ max-height: 1200px;
21
+ }
22
+ }
23
+ #lightbox span {display: block; position: fixed; bottom: 13px; height: 1.5em; line-height: 1.4em; width: 100%; text-align: center; color: white; text-shadow:
24
+ -1px -1px 0 #000,
25
+ 1px -1px 0 #000,
26
+ -1px 1px 0 #000,
27
+ 1px 1px 0 #000;
28
+ }
29
+
30
+ #lightbox span {display: none;}
31
+
32
+ #lightbox .videoWrapperContainer {
33
+ position: relative;
34
+ top: 50%;
35
+ left: 50%;
36
+ -ms-transform: translateX(-50%) translateY(-50%);
37
+ -webkit-transform: translate(-50%,-50%);
38
+ transform: translate(-50%,-50%);
39
+ max-width: 900px;
40
+ max-height: 100%;
41
+ }
42
+ #lightbox .videoWrapperContainer .videoWrapper {
43
+ height: 0;
44
+ line-height: 0;
45
+ margin: 0;
46
+ padding: 0;
47
+ position: relative;
48
+ padding-bottom: 56.333%; /* custom */
49
+ background: black;
50
+ }
51
+ #lightbox .videoWrapper iframe {
52
+ position: absolute;
53
+ top: 0;
54
+ left: 0;
55
+ width: 100%;
56
+ height: 100%;
57
+ border: 0;
58
+ display: block;
59
+ }
60
+ #lightbox #prev, #lightbox #next {height: 50px; line-height: 36px; display: none; margin-top: -25px; position: fixed; top: 50%; padding: 0 15px; cursor: pointer; text-decoration: none; z-index: 99; color: white; font-size: 60px;}
61
+ #lightbox.gallery #prev, #lightbox.gallery #next {display: block;}
62
+ #lightbox #prev {left: 0;}
63
+ #lightbox #next {right: 0;}
64
+ #lightbox #close {height: 50px; width: 50px; position: fixed; cursor: pointer; text-decoration: none; z-index: 99; right: 0; top: 0;}
65
+ #lightbox #close:after, #lightbox #close:before {position: absolute; margin-top: 22px; margin-left: 14px; content: ""; height: 3px; background: white; width: 23px;
66
+ -webkit-transform-origin: 50% 50%;
67
+ -moz-transform-origin: 50% 50%;
68
+ -o-transform-origin: 50% 50%;
69
+ transform-origin: 50% 50%;
70
+ /* Safari */
71
+ -webkit-transform: rotate(-45deg);
72
+ /* Firefox */
73
+ -moz-transform: rotate(-45deg);
74
+ /* IE */
75
+ -ms-transform: rotate(-45deg);
76
+ /* Opera */
77
+ -o-transform: rotate(-45deg);
78
+ }
79
+ #lightbox #close:after {
80
+ /* Safari */
81
+ -webkit-transform: rotate(45deg);
82
+ /* Firefox */
83
+ -moz-transform: rotate(45deg);
84
+ /* IE */
85
+ -ms-transform: rotate(45deg);
86
+ /* Opera */
87
+ -o-transform: rotate(45deg);
88
+ }
89
+ #lightbox, #lightbox * {
90
+ -webkit-user-select: none;
91
+ -moz-user-select: none;
92
+ -ms-user-select: none;
93
+ user-select: none;
94
+ }
@@ -0,0 +1,144 @@
1
+ function is_youtubelink(url) {
2
+ var p = /^(?:https?:\/\/)?(?:www\.)?(?:youtu\.be\/|youtube\.com\/(?:embed\/|v\/|watch\?v=|watch\?.+&v=))((\w|-){11})(?:\S+)?$/;
3
+ return (url.match(p)) ? RegExp.$1 : false;
4
+ }
5
+ function is_imagelink(url) {
6
+ var p = /([a-z\-_0-9\/\:\.]*\.(jpg|jpeg|png|gif))/i;
7
+ return (url.match(p)) ? true : false;
8
+ }
9
+ function is_vimeolink(url,el) {
10
+ var id = false;
11
+ var xmlhttp = new XMLHttpRequest();
12
+ xmlhttp.onreadystatechange = function() {
13
+ if (xmlhttp.readyState == XMLHttpRequest.DONE) { // XMLHttpRequest.DONE == 4
14
+ if (xmlhttp.status == 200) {
15
+ var response = JSON.parse(xmlhttp.responseText);
16
+ id = response.video_id;
17
+ console.log(id);
18
+ el.classList.add('lightbox-vimeo');
19
+ el.setAttribute('data-id',id);
20
+
21
+ el.addEventListener("click", function(event) {
22
+ event.preventDefault();
23
+ document.getElementById('lightbox').innerHTML = '<a id="close"></a><a id="next">&rsaquo;</a><a id="prev">&lsaquo;</a><div class="videoWrapperContainer"><div class="videoWrapper"><iframe src="https://player.vimeo.com/video/'+el.getAttribute('data-id')+'/?autoplay=1&byline=0&title=0&portrait=0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe></div></div>';
24
+ document.getElementById('lightbox').style.display = 'block';
25
+
26
+ setGallery(this);
27
+ });
28
+ }
29
+ else if (xmlhttp.status == 400) {
30
+ alert('There was an error 400');
31
+ }
32
+ else {
33
+ alert('something else other than 200 was returned');
34
+ }
35
+ }
36
+ };
37
+ xmlhttp.open("GET", 'https://vimeo.com/api/oembed.json?url='+url, true);
38
+ xmlhttp.send();
39
+ }
40
+ function setGallery(el) {
41
+ var elements = document.body.querySelectorAll(".gallery");
42
+ elements.forEach(element => {
43
+ element.classList.remove('gallery');
44
+ });
45
+ if(el.closest('ul, p')) {
46
+ var link_elements = el.closest('ul, p').querySelectorAll("a[class*='lightbox-']");
47
+ link_elements.forEach(link_element => {
48
+ link_element.classList.remove('current');
49
+ });
50
+ link_elements.forEach(link_element => {
51
+ if(el.getAttribute('href') == link_element.getAttribute('href')) {
52
+ link_element.classList.add('current');
53
+ }
54
+ });
55
+ if(link_elements.length>1) {
56
+ document.getElementById('lightbox').classList.add('gallery');
57
+ link_elements.forEach(link_element => {
58
+ link_element.classList.add('gallery');
59
+ });
60
+ }
61
+ var currentkey;
62
+ var gallery_elements = document.querySelectorAll('a.gallery');
63
+ Object.keys(gallery_elements).forEach(function (k) {
64
+ if(gallery_elements[k].classList.contains('current')) currentkey = k;
65
+ });
66
+ if(currentkey==(gallery_elements.length-1)) var nextkey = 0;
67
+ else var nextkey = parseInt(currentkey)+1;
68
+ if(currentkey==0) var prevkey = parseInt(gallery_elements.length-1);
69
+ else var prevkey = parseInt(currentkey)-1;
70
+ document.getElementById('next').addEventListener("click", function() {
71
+ gallery_elements[nextkey].click();
72
+ });
73
+ document.getElementById('prev').addEventListener("click", function() {
74
+ gallery_elements[prevkey].click();
75
+ });
76
+ }
77
+ }
78
+
79
+ document.addEventListener("DOMContentLoaded", function() {
80
+
81
+ //create lightbox div in the footer
82
+ var newdiv = document.createElement("div");
83
+ newdiv.setAttribute('id',"lightbox");
84
+ document.body.appendChild(newdiv);
85
+
86
+ //add classes to links to be able to initiate lightboxes
87
+ var elements = document.querySelectorAll('a');
88
+ elements.forEach(element => {
89
+ var url = element.getAttribute('href');
90
+ if(url) {
91
+ if(url.indexOf('vimeo') !== -1 && !element.classList.contains('no-lightbox')) {
92
+ is_vimeolink(url,element);
93
+ }
94
+ if(is_youtubelink(url) && !element.classList.contains('no-lightbox')) {
95
+ element.classList.add('lightbox-youtube');
96
+ element.setAttribute('data-id',is_youtubelink(url));
97
+ }
98
+ if(is_imagelink(url) && !element.classList.contains('no-lightbox')) {
99
+ element.classList.add('lightbox-image');
100
+ var href = element.getAttribute('href');
101
+ var filename = href.split('/').pop();
102
+ var split = filename.split(".");
103
+ var name = split[0];
104
+ element.setAttribute('title',name);
105
+ }
106
+ }
107
+ });
108
+
109
+ //remove the clicked lightbox
110
+ document.getElementById('lightbox').addEventListener("click", function(event) {
111
+ if(event.target.id != 'next' && event.target.id != 'prev'){
112
+ this.innerHTML = '';
113
+ document.getElementById('lightbox').style.display = 'none';
114
+ document.body.style.overflow="visible";
115
+ }
116
+ });
117
+
118
+ //add the youtube lightbox on click
119
+ var elements = document.querySelectorAll('a.lightbox-youtube');
120
+ elements.forEach(element => {
121
+ element.addEventListener("click", function(event) {
122
+ event.preventDefault();
123
+ document.getElementById('lightbox').innerHTML = '<a id="close"></a><a id="next">&rsaquo;</a><a id="prev">&lsaquo;</a><div class="videoWrapperContainer"><div class="videoWrapper"><iframe src="https://www.youtube.com/embed/'+this.getAttribute('data-id')+'?autoplay=1&showinfo=0&rel=0"></iframe></div>';
124
+ document.getElementById('lightbox').style.display = 'block';
125
+ document.body.style.overflow="hidden";
126
+
127
+ setGallery(this);
128
+ });
129
+ });
130
+
131
+ //add the image lightbox on click
132
+ var elements = document.querySelectorAll('a.lightbox-image');
133
+ elements.forEach(element => {
134
+ element.addEventListener("click", function(event) {
135
+ event.preventDefault();
136
+ document.getElementById('lightbox').innerHTML = '<a id="close"></a><a id="next">&rsaquo;</a><a id="prev">&lsaquo;</a><div class="img" style="background: url(\''+this.getAttribute('href')+'\') center center / contain no-repeat;" title="'+this.getAttribute('title')+'" ><img src="'+this.getAttribute('href')+'" alt="'+this.getAttribute('title')+'" /></div><span>'+this.getAttribute('title')+'</span>';
137
+ document.getElementById('lightbox').style.display = 'block';
138
+ document.body.style.overflow="hidden";
139
+
140
+ setGallery(this);
141
+ });
142
+ });
143
+
144
+ });
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: arco
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.3
4
+ version: 0.6.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - meebuhs
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-07-02 00:00:00.000000000 Z
11
+ date: 2020-07-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jekyll
@@ -42,6 +42,7 @@ files:
42
42
  - _config.yml
43
43
  - _includes/cover.html
44
44
  - _includes/footer.html
45
+ - _includes/lazyload.html
45
46
  - _includes/mathjax.html
46
47
  - _includes/sidebar.html
47
48
  - _layouts/404.html
@@ -78,6 +79,8 @@ files:
78
79
  - assets/js/fade-transitions.js
79
80
  - assets/js/post-grid-init.js
80
81
  - assets/js/sidebar.js
82
+ - assets/lightbox/lightbox.css
83
+ - assets/lightbox/lightbox.js
81
84
  homepage: https://github.com/meebuhs/arco
82
85
  licenses:
83
86
  - MIT