arco 0.5.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4bf0684bfe3cbb64808bdb1510ae705f1a09f0127829bed124b86b2da7c17b77
4
- data.tar.gz: 3f080301fc5926c6646bc1ddc3a7584b91103d02f57d2b2df146527cdfe60729
3
+ metadata.gz: 65e6776531db3a3448bc6cf2e7e145b041d64c333251b576241014f0a265c817
4
+ data.tar.gz: 5b4eeebb07bccb252d8034437bb2b6121bc4aae412e64008a0ebcf1865b04b1f
5
5
  SHA512:
6
- metadata.gz: 83b1d07dc317b935e82b75bc556ff9358f9b8b09142c040850a5f69e43d749f7914c7398f42cc126d8d6151f408d7715241729743a222b2fa9b47b6d4e8c6df5
7
- data.tar.gz: 9f474532ebcb6223393c9886b16073115538411ea73047b07bcfd3a9fd975af8a2379ad198b2c382e3bd380f1ee2f4369d7196137a4cbbfeb9e5d79322f34da6
6
+ metadata.gz: 3c6ded0190753934c1395f5c158f86138ac0cfa37f8927af581406f0f54bb37636a880c8a83aabaad60ce8568f987bcf0ececb5a2cdf3ceab9914d40ae631b83
7
+ data.tar.gz: 8514c2cbd55de8b750f536f1dbdec2b54ca8cd360fd5303db81c9fbe457be062d8105adbbb32cda316bd02eaaf40065a517814aa7bcfa11fdd83f6da5370d74b
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # arco
2
2
 
3
- Arco is a responsive fixed-sidebar layout with a two column masonry grid which also features a landing page, a 404 page, smooth page transitions and a simple permalink structure.
3
+ Arco is a responsive fixed-sidebar layout with a responsive masonry grid which also features a landing page, a 404 page, smooth page transitions and a simple permalink structure.
4
4
 
5
5
  This theme also utilises [jekyll-seo-tag](https://github.com/jekyll/jekyll-seo-tag) and [jekyll-sitemap](https://github.com/jekyll/jekyll-sitemap) to ensure your work will be seen.
6
6
 
@@ -80,9 +80,13 @@ 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/
84
- cover-image: /assets/image-for-front-page.png
85
- image: /assets/image-for-top-of-post.png
83
+ urls:
84
+ source: https://project.source/link/
85
+ download: https://project.download/link/
86
+ images:
87
+ cover: /assets/image-for-front-page.png
88
+ top: /assets/image-for-top-of-post.png
89
+ tags: [tags, which, relate, to, post]
86
90
  mathjax: true | false
87
91
  ---
88
92
  ```
@@ -91,6 +95,24 @@ mathjax: true | false
91
95
 
92
96
  Simply add your favicon `favicon.png` to the root of your site.
93
97
 
98
+ ### Lazy loading
99
+
100
+ In order to enable lazy loading on an image you must add a `data-echo` attribute like so:
101
+
102
+ ```html
103
+ <img src="/assets/placeholder-for-image.png" alt="alt-text" data-echo="/assets/actual-image.png" />
104
+ ```
105
+
106
+ ### Image lightbox
107
+
108
+ In order to open an image in a fullscreen lightbox on click, you must wrap the image in a link tag like so:
109
+
110
+ ```html
111
+ <a href="/assets/actual-image.png">
112
+ <img src="/assets/placeholder-for-image.png" alt="alt-text" data-echo="/assets/actual-image.png" />
113
+ </a>
114
+ ```
115
+
94
116
  ### Markdown features
95
117
 
96
118
  [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,41 @@
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 %}
31
+ <a href="{{ site.github_url }}">github</a>
32
+ {% endif %}
33
+ {% if site.github_url and site.resume %}
34
+ /
35
+ {% endif %}
36
+ {% if site.resume %}
37
+ <a href="{{ "/resume" }}" class="fade-onclick">resume</a>
38
+ {% endif %}
39
+ </div>
22
40
  </div>
23
41
  </section>
@@ -2,6 +2,7 @@
2
2
  <html lang="en-AU">
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
5
6
  <link rel="shortcut icon" type="image/png" href="favicon.png?">
6
7
  <link rel="stylesheet" href="/assets/css/main.css">
7
8
  </head>
@@ -2,6 +2,7 @@
2
2
  <html lang="en-AU">
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
5
6
  <link rel="shortcut icon" type="image/png" href="favicon.png?">
6
7
  <link rel="stylesheet" href="/assets/css/main.css">
7
8
  <link rel="stylesheet" href="/assets/flexmasonry/flexmasonry.css">
@@ -11,8 +12,11 @@
11
12
  <body>
12
13
  {% include sidebar.html %}
13
14
  {{ content }}
15
+ {% include lazyload.html %}
16
+ <script type="text/javascript" src="/assets/lightbox/lightbox.js"></script>
17
+ <link rel="stylesheet" href="/assets/lightbox/lightbox.css">
18
+ <script src="/assets/js/sidebar.js"></script>
19
+ <script src="/assets/js/fade-transitions.js"></script>
20
+ <script>fadeInPage();</script>
14
21
  </body>
15
- <script src="/assets/js/sidebar.js"></script>
16
- <script src="/assets/js/fade-transitions.js"></script>
17
- <script>fadeInPage();</script>
18
22
  </html>
@@ -2,6 +2,7 @@
2
2
  <html lang="en-AU">
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
5
6
  <link rel="shortcut icon" type="image/png" href="favicon.png?">
6
7
  <link rel="stylesheet" href="/assets/css/main.css">
7
8
  {% seo %}
@@ -10,7 +10,9 @@ layout: default
10
10
  <div class="list-post">
11
11
  <a href="{{ post.url }}" class="fade-onclick">
12
12
  <div class="list-post-link">
13
- <img class="list-post-image" src="{{ post.cover-image }}" />
13
+ {% if post.images.cover %}
14
+ <img class="list-post-image" src="{{ post.images.cover }}" />
15
+ {% endif %}
14
16
  <div class="list-post-info">
15
17
  <div class="list-post-title">{{ post.title }}</div>
16
18
  <div class="list-post-summary">{{ post.summary }}</div>
@@ -10,10 +10,14 @@ layout: default
10
10
  <svg id="content-fader"></svg>
11
11
  <div class="post">
12
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>
13
+ <a href="{{ site.url }}\projects\" class="button-light-primary fade-onclick">Home</a>
14
+ {% if page.urls.source %}
15
+ <a href="{{ page.urls.source }}" class="button-light-secondary">See the source</a>
16
16
  {% endif %}
17
+ {% if page.urls.download %}
18
+ <a href="{{ page.urls.download }}" class="button-light-tertiary">Download {{ page.title }}</a>
19
+ {% endif %}
20
+
17
21
  </div>
18
22
 
19
23
  <div class="post-title"><h1>{{ page.title }}</h1></div>
@@ -23,16 +27,21 @@ layout: default
23
27
  &middot;
24
28
  <a href="{{ "/projects/" }}{{ page.category }}" class="fade-onclick"><span class="post-category">{{ page.category }}</span></a>
25
29
  </div>
26
- <img class="post-image" src="{{ page.image }}" />
30
+ <a href="{{ page.images.top }}">
31
+ <img class="post-image" alt="{{ page.title }} | {{ page.description | truncate: 80 }}" src="{{ page.images.top }}" />
32
+ </a>
27
33
 
28
34
  <div class="post-content">
29
35
  {{ content }}
30
36
  </div>
31
37
 
32
38
  <div class="post-buttons">
33
- <a href="{{ site.url }}\projects\" class="button-light-secondary">Home</a>
34
- {% if page.source-url %}
35
- <a href="{{ page.source-url }}" class="button-light-tertiary">See the source </></a>
39
+ <a href="{{ site.url }}\projects\" class="button-light-primary fade-onclick">Home</a>
40
+ {% if page.urls.source %}
41
+ <a href="{{ page.urls.source }}" class="button-light-secondary">See the source</a>
42
+ {% endif %}
43
+ {% if page.urls.download %}
44
+ <a href="{{ page.urls.download }}" class="button-light-tertiary">Download {{ page.title }}</a>
36
45
  {% endif %}
37
46
  </div>
38
47
  </div>
@@ -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
  }
@@ -7,6 +7,7 @@ html, body {
7
7
  height: 100%;
8
8
  box-sizing: border-box;
9
9
  font-family: "Open Sans", Arial, sans-serif;
10
+ font-size: 16px;
10
11
  -webkit-font-smoothing: antialiased;
11
12
  text-rendering: optimizeLegibility;
12
13
  }
@@ -125,9 +126,9 @@ li, ul {
125
126
  line-height: 1.5em;
126
127
  }
127
128
 
128
- .site-image {
129
- width: 200px;
130
- border-radius: 50%;
129
+ .MathJax_Display {
130
+ overflow-x: auto;
131
+ overflow-y: hidden;
131
132
  }
132
133
 
133
134
  .content {
@@ -9,6 +9,7 @@
9
9
  background-color: $background;
10
10
  color: $highlight;
11
11
  font-weight: bold;
12
+ font-size: 1rem;
12
13
  &:hover, &:focus {
13
14
  background-color: $highlight;
14
15
  color: $background;
@@ -1,8 +1,8 @@
1
1
  // Colours
2
2
 
3
3
  $primary-highlight: #f2777a;
4
- $secondary-highlight: #66cccc;
5
- $tertiary-highlight: #ffcc66;
4
+ $secondary-highlight: #6b7fd7;
5
+ $tertiary-highlight: #66cccc;
6
6
 
7
7
  $sidebar-colour: #1a2a38;
8
8
  $hover-colour: #e5e5e5;
@@ -15,5 +15,5 @@ $table-background-colour: #e5e5e5;
15
15
  // Sizes
16
16
 
17
17
  $sidebar-width: 330px;
18
- $sidebar-height-min: 100px;
19
- $sidebar-height: 150px;
18
+ $sidebar-height-min: 120px;
19
+ $sidebar-height: 170px;
@@ -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.5rem;
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: 1rem;
47
47
  }
48
48
 
49
49
  .list-post-footer {
@@ -53,12 +53,12 @@
53
53
  .list-post-date {
54
54
  color: $secondary-highlight;
55
55
  font-weight: bold;
56
- font-size: 14px;
56
+ font-size: 0.9rem;
57
57
  }
58
58
 
59
59
  .list-post-category {
60
60
  font-weight: bold;
61
- font-size: 14px;
61
+ font-size: 0.9rem;
62
62
  color: $primary-highlight;
63
63
  &:hover, &:focus {
64
64
  color: lighten($primary-highlight, 14%);
@@ -67,7 +67,7 @@
67
67
 
68
68
  .list-post-tags {
69
69
  font-weight: bold;
70
- font-size: 14px;
70
+ font-size: 0.9rem;
71
71
  color: $tertiary-highlight;
72
72
  margin-top: 0.4em;
73
73
  }
@@ -1,10 +1,9 @@
1
1
  .post {
2
- margin-top: 4em;
3
2
  width: 100%;
4
3
  }
5
4
 
6
5
  .post-title h1 {
7
- margin: 1.5em 0 0 0;
6
+ margin: 0;
8
7
  }
9
8
 
10
9
  .post-description {
@@ -14,19 +13,20 @@
14
13
  .post-date {
15
14
  color: $secondary-highlight;
16
15
  font-weight: bold;
17
- font-size: 14px;
16
+ font-size: 0.9rem;
18
17
  }
19
18
 
20
19
  .post-image {
21
20
  display: block;
22
- width: 70%;
21
+ max-width: 70%;
22
+ max-height: 50vh;
23
23
  margin: 2em auto 0 auto;
24
24
  border-radius: 5px;
25
25
  }
26
26
 
27
27
  .post-category {
28
28
  font-weight: bold;
29
- font-size: 14px;
29
+ font-size: 0.9rem;
30
30
  color: $primary-highlight;
31
31
  &:hover, &:focus {
32
32
  color: lighten($primary-highlight, 14%);
@@ -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,14 +31,36 @@
32
31
  transition: all .35s ease;
33
32
  }
34
33
 
35
- @media only screen and (orientation: portrait) {
36
- #sidebar {
37
- flex-direction: row;
38
- justify-content: space-evenly;
39
- align-items: center;
40
- text-align: center;
41
- }
34
+ .content {
35
+ display: flex;
36
+ flex: 1;
37
+ flex-direction: column;
38
+ align-items: center;
39
+ }
42
40
 
41
+ #content-fader {
42
+ position: fixed;
43
+ right: 0;
44
+ z-index: 9999;
45
+ pointer-events: none;
46
+ background: white;
47
+ opacity: 1;
48
+ animation-duration: .35s;
49
+ animation-timing-function: ease;
50
+ }
51
+
52
+ #sidebar-fader {
53
+ position: fixed;
54
+ left: 0;
55
+ z-index: 9999;
56
+ pointer-events: none;
57
+ background: $sidebar-colour;
58
+ opacity: 1;
59
+ animation-duration: .35s;
60
+ animation-timing-function: ease;
61
+ }
62
+
63
+ @media only screen and (orientation: portrait) {
43
64
  .sidebar {
44
65
  width: 100%;
45
66
  height: $sidebar-height;
@@ -51,45 +72,93 @@
51
72
  }
52
73
 
53
74
  .sidebar-text {
54
- display: flex;
55
- flex-direction: column;
75
+ h6 {
76
+ margin: 0;
77
+ }
56
78
  }
57
79
 
58
80
  .content {
59
- flex: 1;
60
81
  max-width: 100%;
61
- margin: 190px 1em 1em 1em;
62
- display: flex;
63
- flex-direction: column;
64
- align-items: center;
82
+ margin: calc(#{$sidebar-height} + 1em) 1em 1em 1em;
65
83
  }
66
84
 
67
85
  #content-fader {
68
- position: fixed;
69
86
  bottom: 0;
70
- right: 0;
71
87
  height: calc(100% - #{$sidebar-height});
72
88
  width: 100%;
73
- z-index: 9999;
74
- pointer-events: none;
75
- background: white;
76
- opacity: 1;
77
- animation-duration: .35s;
78
- animation-timing-function: ease;
79
89
  }
80
90
 
81
91
  #sidebar-fader {
82
- position: fixed;
83
92
  top: 0;
84
- left: 0;
85
93
  height: $sidebar-height;
86
94
  width: 100%;
87
- z-index: 9999;
88
- pointer-events: none;
89
- background: $sidebar-colour;
90
- opacity: 1;
91
- animation-duration: .35s;
92
- animation-timing-function: ease;
95
+ }
96
+
97
+ @media (min-width: 450px) {
98
+ #sidebar {
99
+ flex-direction: row;
100
+ justify-content: space-between;
101
+ align-items: center;
102
+ text-align: center;
103
+ }
104
+
105
+ .sidebar-header {
106
+ display: flex;
107
+ margin-left: 1em;
108
+ }
109
+
110
+ .sidebar-image-container {
111
+ margin-right: 1em;
112
+ }
113
+
114
+ .sidebar-image {
115
+ width: 80px;
116
+ height: 80px;
117
+ border-radius: 50%;
118
+ }
119
+
120
+ .sidebar-text {
121
+ text-align: start;
122
+ h1 {
123
+ margin-top: -0.2em;
124
+ }
125
+ }
126
+
127
+ .sidebar-links {
128
+ margin-right: 1em;
129
+ text-align: end;
130
+ }
131
+
132
+ .post-buttons {
133
+ margin: 3em 0;
134
+ }
135
+ }
136
+
137
+ @media (max-width: 450px) {
138
+ #sidebar {
139
+ flex-direction: column;
140
+ text-align: center;
141
+ justify-content: center;
142
+ }
143
+
144
+ .sidebar-image-container {
145
+ display: none;
146
+ }
147
+
148
+ .sidebar-text {
149
+ h1 {
150
+ margin-top: -0.3em;
151
+ }
152
+ }
153
+
154
+ .post-buttons {
155
+ margin: 0;
156
+ display: flex;
157
+ flex-direction: column;
158
+ a {
159
+ margin: .5em;
160
+ }
161
+ }
93
162
  }
94
163
  }
95
164
 
@@ -104,46 +173,37 @@
104
173
  width: $sidebar-width;
105
174
  height: 100%;
106
175
  }
176
+
177
+ .sidebar-image {
178
+ width: 200px;
179
+ height: 200px;
180
+ border-radius: 50%;
181
+ }
107
182
 
108
183
  .content {
109
- flex: 1;
110
- display: flex;
111
- flex-direction: column;
112
- align-items: center;
113
184
  justify-content: space-between;
114
185
  margin: 1em 1em 1em calc(1em + #{$sidebar-width});
115
186
  }
116
187
 
117
188
  .sidebar-links {
118
- margin-top: 1.67em;
189
+ margin-top: 1em;
119
190
  }
120
191
 
121
192
  #content-fader {
122
- position: fixed;
123
193
  top: 0;
124
- right: 0;
125
194
  width: calc(100% - #{$sidebar-width});
126
195
  height: 100%;
127
- z-index: 9999;
128
- pointer-events: none;
129
196
  background: white;
130
- opacity: 1;
131
- animation-duration: .35s;
132
- animation-timing-function: ease;
133
197
  }
134
198
 
135
199
  #sidebar-fader {
136
- position: fixed;
137
200
  bottom: 0;
138
- left: 0;
139
201
  height: 100%;
140
202
  width: $sidebar-width;
141
- z-index: 9999;
142
- pointer-events: none;
143
- background: $sidebar-colour;
144
- opacity: 1;
145
- animation-duration: .35s;
146
- animation-timing-function: ease;
203
+ }
204
+
205
+ .post-buttons {
206
+ margin: 3em 0;
147
207
  }
148
208
  }
149
209
 
@@ -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: 1rem;
7
7
  background-color: #f8f8f8;
8
- font-size: 14px;
9
8
  }
10
9
 
11
10
  code {
@@ -17,7 +16,7 @@ code {
17
16
  pre { // only apply for code blocks
18
17
  overflow: auto;
19
18
  display: block;
20
- padding: 1em;
19
+ padding: 0 20px 20px 20px;
21
20
  margin: 0 0 1em;
22
21
  line-height: 1.3;
23
22
  word-break: break-all;
@@ -46,16 +45,17 @@ pre code {
46
45
  }
47
46
  pre code {
48
47
  color: #cccccc;
49
- ::before {
48
+ &::before {
50
49
  content: attr(data-lang);
51
- position: absolute;
50
+ position: -webkit-sticky;
51
+ position: sticky;
52
+ display: block;
52
53
  top: 0;
53
- right: 0;
54
+ left: 0;
54
55
  color: #ccc;
55
- text-align: right;
56
+ text-align: left;
56
57
  text-transform: uppercase;
57
- font-size: 0.85em;
58
- padding: 5px 10px 0;
58
+ font-size: 0.85rem;
59
59
  line-height: 20px;
60
60
  height: 20px;
61
61
  font-weight: 600;
@@ -1,4 +1,7 @@
1
1
  FlexMasonry.init('.list-posts', {
2
- responsive: false,
3
- numCols: 2
2
+ responsive: true,
3
+ breakpointCols: {
4
+ 'min-width: 1500px': 3,
5
+ 'min-width: 700px': 2,
6
+ }
4
7
  });
@@ -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.5.0
4
+ version: 0.7.0
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-04 00:00:00.000000000 Z
11
+ date: 2020-07-09 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