jekyll-wren 0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE.md +9 -0
- data/README.md +177 -0
- data/_includes/custom-foot.html +4 -0
- data/_includes/custom-head.html +13 -0
- data/_includes/custom-meta.html +5 -0
- data/_includes/footer.html +23 -0
- data/_includes/head.html +21 -0
- data/_includes/meta.html +82 -0
- data/_includes/navigation.html +70 -0
- data/_includes/reading-time.html +41 -0
- data/_includes/social-list.html +46 -0
- data/_includes/video-player.html +66 -0
- data/_layouts/author-list.html +73 -0
- data/_layouts/default.html +16 -0
- data/_layouts/error.html +9 -0
- data/_layouts/page.html +14 -0
- data/_layouts/post-list.html +67 -0
- data/_layouts/post.html +16 -0
- data/_layouts/tag-list.html +54 -0
- data/_sass/wren/content.scss +345 -0
- data/_sass/wren/initialize.scss +118 -0
- data/_sass/wren/layout.scss +295 -0
- data/assets/apple-touch-icon.png +0 -0
- data/assets/flav.svg +4 -0
- data/assets/nav-icons/about.svg +3 -0
- data/assets/nav-icons/blog.svg +3 -0
- data/assets/nav-icons/comments.svg +3 -0
- data/assets/nav-icons/default.svg +3 -0
- data/assets/nav-icons/home.svg +4 -0
- data/assets/nav-icons/rss.svg +3 -0
- data/assets/nav-icons/top.svg +3 -0
- data/assets/nav-icons/work.svg +5 -0
- data/assets/social-icons/Blogger.svg +3 -0
- data/assets/social-icons/DEV.svg +3 -0
- data/assets/social-icons/Default.svg +3 -0
- data/assets/social-icons/Dribbble.svg +3 -0
- data/assets/social-icons/Facebook.svg +3 -0
- data/assets/social-icons/Flickr.svg +3 -0
- data/assets/social-icons/Ghost.svg +3 -0
- data/assets/social-icons/GitHub.svg +3 -0
- data/assets/social-icons/GitLab.svg +3 -0
- data/assets/social-icons/Instagram.svg +5 -0
- data/assets/social-icons/Keybase.svg +6 -0
- data/assets/social-icons/LinkedIn.svg +3 -0
- data/assets/social-icons/Mastodon.svg +3 -0
- data/assets/social-icons/Medium.svg +5 -0
- data/assets/social-icons/Micro.blog.svg +3 -0
- data/assets/social-icons/Pinterest.svg +3 -0
- data/assets/social-icons/Reddit.svg +3 -0
- data/assets/social-icons/StackOverflow.svg +3 -0
- data/assets/social-icons/Telegram.svg +3 -0
- data/assets/social-icons/Tumblr.svg +3 -0
- data/assets/social-icons/Twitter.svg +3 -0
- data/assets/social-icons/Wordpress.svg +4 -0
- data/assets/social-icons/YouTube.svg +3 -0
- data/assets/style.scss +14 -0
- data/errors/400.md +9 -0
- data/errors/403.md +9 -0
- data/errors/404.md +9 -0
- data/errors/418.md +12 -0
- data/errors/500.md +9 -0
- data/images/profile-hq.jpg +0 -0
- data/images/profile.jpg +0 -0
- metadata +183 -0
@@ -0,0 +1,46 @@
|
|
1
|
+
{%comment%} values come from mix of config and data file {%endcomment%}
|
2
|
+
{%- assign config = site.wren.social_links -%}
|
3
|
+
{%- assign data = site.wren_social_data -%}
|
4
|
+
|
5
|
+
{%comment%} double loop allows multiple from same service {%endcomment%}
|
6
|
+
{%- for service in config -%}
|
7
|
+
{%- for entry in service[1] -%}
|
8
|
+
{%comment%} can give username as object or value {%endcomment%}
|
9
|
+
{%- assign handle = entry.username | default: entry -%}
|
10
|
+
|
11
|
+
{%comment%}
|
12
|
+
Key by which config identifies the service. Note that this key doesn't have to
|
13
|
+
be known to the data file also; this template's logic will muddle through what
|
14
|
+
information it has and piece together a button as best it can.
|
15
|
+
{%endcomment%}
|
16
|
+
{%-assign key = service[0] -%}
|
17
|
+
|
18
|
+
{%comment%} checks if Wren covers service, if not switch to fallbacks {%endcomment%}
|
19
|
+
{%- assign name = data[key]["name"] | default: entry.name -%}
|
20
|
+
{%- assign icon = data[key]["name"] | default: "Default" -%}
|
21
|
+
|
22
|
+
{%comment%} url can come from config or datafile {%endcomment%}
|
23
|
+
{%- assign url = entry.instance | default: data[key]["url"] -%}
|
24
|
+
|
25
|
+
{%comment%} handle service specific url delimiters {%endcomment%}
|
26
|
+
{%- if key == "mastodon" or key == "medium" -%}
|
27
|
+
{%- assign delimiter = "/@" -%}
|
28
|
+
{%- else -%}
|
29
|
+
{%- assign delimiter = "/" -%}
|
30
|
+
{%- endif -%}
|
31
|
+
|
32
|
+
{%comment%} id allows URLs to differ from usernames {%endcomment%}
|
33
|
+
{%- assign url_handle = entry.id | default: handle -%}
|
34
|
+
|
35
|
+
{%comment%} generate the full profile url {%endcomment%}
|
36
|
+
{%- assign profile_link = url | prepend: 'https://' | append: delimiter | append: url_handle -%}
|
37
|
+
|
38
|
+
{%comment%} actual HTML which forms the social button {%endcomment%}
|
39
|
+
<a rel="author" alt="{{ name }}" title="{{ handle }}" href="{{ profile_link }}">
|
40
|
+
<svg>
|
41
|
+
{%comment%} #soc acts as an anchor for the import {%endcomment%}
|
42
|
+
<use xlink:href="{{ icon | prepend: '/assets/social-icons/' | append: '.svg#soc' | relative_url }}"/>
|
43
|
+
</svg>
|
44
|
+
</a>
|
45
|
+
{%endfor%}
|
46
|
+
{% endfor %}
|
@@ -0,0 +1,66 @@
|
|
1
|
+
{% comment %}
|
2
|
+
Embedded video player for a bunch of different host websites.
|
3
|
+
Takes the parameters `site` for video host, `alt` for the title,
|
4
|
+
and `id` for the video ID (usually in the URL) and then returns
|
5
|
+
the iframe needed to embed that video in a page. It's based on
|
6
|
+
the templates from https://github.com/nathancy/jekyll-embed-video
|
7
|
+
but combined into a one player, rather than players for each host.
|
8
|
+
{% endcomment %}
|
9
|
+
|
10
|
+
{% comment %} default player variables {% endcomment %}
|
11
|
+
{%- assign width = "500px" -%}
|
12
|
+
{%- assign height = "281px" -%}
|
13
|
+
{%- assign allow_autoplay = false -%}
|
14
|
+
{%- assign allow_fullscreen = true -%}
|
15
|
+
|
16
|
+
{% comment %}
|
17
|
+
Some sites also ask for the site doing the embedding for
|
18
|
+
security purposes, so this quick check makes sure things
|
19
|
+
keep working seamlessly between local and prod builds.
|
20
|
+
{% endcomment %}
|
21
|
+
{%- if jekyll.environment == "production" -%}
|
22
|
+
{%- assign host = site.url -%}
|
23
|
+
{%- else -%}
|
24
|
+
{%- assign host = "127.0.0.1" -%}
|
25
|
+
{% endif -%}
|
26
|
+
|
27
|
+
{% comment %} shortcut variables {% endcomment %}
|
28
|
+
{%- assign id = include.id -%}
|
29
|
+
{%- assign source = include.site -%}
|
30
|
+
|
31
|
+
{%- if source == "Dailymotion" -%}
|
32
|
+
{%- assign url = "dailymotion.com/embed/video/" -%}
|
33
|
+
{%- elsif source == "Google Drive" -%}
|
34
|
+
{%- assign url = "drive.google.com/file/d/" -%}
|
35
|
+
{%- elsif source == "Streamable" -%}
|
36
|
+
{%- assign url = "streamable.com/s/" -%}
|
37
|
+
{%- elsif source == "Twitch" -%}
|
38
|
+
{%- assign url = "clips.twitch.tv/embed?clip=" -%}
|
39
|
+
{%- assign id = id | append: "&parent=" | append: host -%}
|
40
|
+
{%- elsif source == "Vimeo" -%}
|
41
|
+
{%- assign url = "player.vimeo.com/video/" -%}
|
42
|
+
{%- elsif source == "YouTube" -%}
|
43
|
+
{%- assign url = "youtube.com/embed/" -%}
|
44
|
+
{%- endif -%}
|
45
|
+
|
46
|
+
<iframe
|
47
|
+
class = "video-embed"
|
48
|
+
alt = "{{ include.alt }}"
|
49
|
+
title = "{{ include.alt }}"
|
50
|
+
src = "{{ url | append: id | prepend: 'https://' }}"
|
51
|
+
width = {{ width }}
|
52
|
+
height = {{ height }}
|
53
|
+
frameborder = "0"
|
54
|
+
scrolling = "no"
|
55
|
+
{% if allow_autoplay == true -%}
|
56
|
+
allow = "autoplay"
|
57
|
+
autoplay = true
|
58
|
+
{% else -%}
|
59
|
+
autoplay = false
|
60
|
+
{%- endif -%}
|
61
|
+
{% if allow_fullscreen == true -%}
|
62
|
+
webkitallowfullscreen
|
63
|
+
mozallowfullscreen
|
64
|
+
allowfullscreen
|
65
|
+
{%- endif -%}>
|
66
|
+
</iframe>
|
@@ -0,0 +1,73 @@
|
|
1
|
+
---
|
2
|
+
layout: page
|
3
|
+
---
|
4
|
+
|
5
|
+
<div class="post-list-page">
|
6
|
+
|
7
|
+
{%comment%} allows for preface before author list {%endcomment%}
|
8
|
+
{{ content }}
|
9
|
+
|
10
|
+
{%comment%}
|
11
|
+
Okay so hear me out. While Jekyll does have the site.authors variable,
|
12
|
+
unlike with site.tags this isn't a list of all the authors across all
|
13
|
+
posts which can be indexed into like site.tags["misc"]. Instead it's
|
14
|
+
just just a variable (object or value) defined in the config file.
|
15
|
+
|
16
|
+
At the same time, Liquid doesn't provide a way to directly initialise
|
17
|
+
arbitrary arrays without a data file, and Jekyll can't generate or use
|
18
|
+
data files without a plugin which GitHub pages doesn't support.
|
19
|
+
|
20
|
+
All that together means to list posts by author we need to:
|
21
|
+
|
22
|
+
1. loop over all the posts on the site and append authors to a
|
23
|
+
string which at the end is split to create an array.
|
24
|
+
|
25
|
+
2. loop over all the authors in that array and display a header for
|
26
|
+
each. Within each author loop though we loop again over all the
|
27
|
+
site posts. If the post contains the author in its post.authors,
|
28
|
+
we display that post under the author's header.
|
29
|
+
|
30
|
+
It's more than a bit messy and would be a easier with a plugin, data
|
31
|
+
file, or Paginate v2 collection, but in the absence of those it works.
|
32
|
+
{% endcomment %}
|
33
|
+
|
34
|
+
{%comment%} create array of all post authors {% endcomment %}
|
35
|
+
{%- assign authors = "" %}
|
36
|
+
{%- for post in site.posts %}
|
37
|
+
{%- for author in post.author -%}
|
38
|
+
{%- if authors contains author -%}
|
39
|
+
{%comment%} skip {% endcomment %}
|
40
|
+
{%- else %}
|
41
|
+
{% assign authors = authors | append: author | append: ',' -%}
|
42
|
+
{%- endif -%}
|
43
|
+
{%- endfor -%}
|
44
|
+
{%- endfor -%}
|
45
|
+
{%- assign authors = authors | split: ',' -%}
|
46
|
+
|
47
|
+
{%comment%} list all the posts by author {% endcomment %}
|
48
|
+
{%- for site_author in authors -%}
|
49
|
+
{%- assign author_id = site_author | replace: ' ', '_' -%}
|
50
|
+
<h2 class="post-list-header">
|
51
|
+
<a id={{ author_id }} href={{ author_id | prepend: '#' }}>
|
52
|
+
{{ site_author }}
|
53
|
+
</a>
|
54
|
+
</h2>
|
55
|
+
|
56
|
+
<ul class="post-list">
|
57
|
+
{%- for post in site.posts -%}
|
58
|
+
{%- if post.author contains site_author -%}
|
59
|
+
<li>
|
60
|
+
<a class="post-link" href="{{ post.url | relative_url }}">
|
61
|
+
{{ post.title | escape }}
|
62
|
+
</a>
|
63
|
+
{%- include meta.html -%}
|
64
|
+
{%- if site.show_list_excerpts -%}
|
65
|
+
{{ post.excerpt }}
|
66
|
+
{%- endif -%}
|
67
|
+
</li>
|
68
|
+
{%- endif -%}
|
69
|
+
{%- endfor -%}
|
70
|
+
</ul>
|
71
|
+
{%- endfor -%}
|
72
|
+
|
73
|
+
</div>
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html lang="{{ page.lang | default: site.lang | default: "en" }}">
|
3
|
+
|
4
|
+
{%- include head.html -%}
|
5
|
+
|
6
|
+
<body>
|
7
|
+
{%- include navigation.html -%}
|
8
|
+
|
9
|
+
<main class="page-content" aria-label="Content">
|
10
|
+
{{ content }}
|
11
|
+
</main>
|
12
|
+
|
13
|
+
{%- include footer.html -%}
|
14
|
+
</body>
|
15
|
+
|
16
|
+
</html>
|
data/_layouts/error.html
ADDED
data/_layouts/page.html
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
---
|
2
|
+
layout: default
|
3
|
+
---
|
4
|
+
|
5
|
+
<div class="post-list-page">
|
6
|
+
|
7
|
+
{%- if page.title -%}
|
8
|
+
<h1 class="post-title">{{ page.title }}</h1>
|
9
|
+
{%- endif -%}
|
10
|
+
|
11
|
+
{%comment%} allows for preface before post list {%endcomment%}
|
12
|
+
{{ content }}
|
13
|
+
|
14
|
+
{% if site.paginate %}
|
15
|
+
{% assign posts = paginator.posts %}
|
16
|
+
{% else %}
|
17
|
+
{% assign posts = site.posts %}
|
18
|
+
{% endif %}
|
19
|
+
|
20
|
+
{%- if posts.size > 0 -%}
|
21
|
+
{%comment%} including <h2> even if empty ensures proper spacing {%endcomment%}
|
22
|
+
<h2 class="post-list-header">
|
23
|
+
{%- if page.list_title -%}
|
24
|
+
{{ page.list_title }}
|
25
|
+
{%- endif -%}
|
26
|
+
</h2>
|
27
|
+
<ul class="post-list">
|
28
|
+
{%- for post in posts -%}
|
29
|
+
<li>
|
30
|
+
<a class="post-link" href="{{ post.url | relative_url }}">
|
31
|
+
{{ post.title | escape }}
|
32
|
+
</a>
|
33
|
+
{%- include meta.html -%}
|
34
|
+
{%- if site.show_excerpts -%}
|
35
|
+
{{ post.excerpt }}
|
36
|
+
{%- endif -%}
|
37
|
+
</li>
|
38
|
+
{%- endfor -%}
|
39
|
+
</ul>
|
40
|
+
|
41
|
+
{% comment %} only display pagination navbar if switched on {% endcomment %}
|
42
|
+
{%- if site.paginate -%}
|
43
|
+
{% comment %} and even if it is, only if there's more than one page {% endcomment %}
|
44
|
+
{%- if paginator.previous_page or paginator.next_page -%}
|
45
|
+
<div class="pagination">
|
46
|
+
{%- if paginator.previous_page %}
|
47
|
+
<a href="{{ paginator.previous_page_path | relative_url }}" class="previous-page">Prev</a>
|
48
|
+
{%- else %}
|
49
|
+
<div class="pager-edge">First</div>
|
50
|
+
{%- endif %}
|
51
|
+
|
52
|
+
<div>•</div>
|
53
|
+
<div class="current-page">Page {{ paginator.page }}</div>
|
54
|
+
<div>•</div>
|
55
|
+
|
56
|
+
{%- if paginator.next_page %}
|
57
|
+
<a href="{{ paginator.next_page_path | relative_url }}" class="next-page">Next</a>
|
58
|
+
{%- else %}
|
59
|
+
<div class="pager-edge">Last</div>
|
60
|
+
{%- endif %}
|
61
|
+
</div>
|
62
|
+
{%- endif -%}
|
63
|
+
{%- endif -%}
|
64
|
+
|
65
|
+
{%- endif -%}
|
66
|
+
|
67
|
+
</div>
|
data/_layouts/post.html
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
---
|
2
|
+
layout: default
|
3
|
+
---
|
4
|
+
<article class="post h-entry" itemscope itemtype="http://schema.org/BlogPosting">
|
5
|
+
|
6
|
+
<header class="post-header">
|
7
|
+
<h1 class="post-title p-name" itemprop="name headline">{{ page.title | escape }}</h1>
|
8
|
+
{%- include meta.html -%}
|
9
|
+
</header>
|
10
|
+
|
11
|
+
<div class="post-content e-content" itemprop="articleBody">
|
12
|
+
{{ content }}
|
13
|
+
</div>
|
14
|
+
|
15
|
+
<a class="u-url" href="{{ page.url | relative_url }}" hidden></a>
|
16
|
+
</article>
|
@@ -0,0 +1,54 @@
|
|
1
|
+
---
|
2
|
+
layout: page
|
3
|
+
---
|
4
|
+
|
5
|
+
{%- assign tags = site.tags | sort -%}
|
6
|
+
{%- assign a = site.wren.tag_cloud.a | default: 15 -%}
|
7
|
+
{%- assign b = site.wren.tag_cloud.b | default: 80 -%}
|
8
|
+
|
9
|
+
<div class="post-list-page">
|
10
|
+
|
11
|
+
<div class="tag-cloud">
|
12
|
+
{%- for tag in tags -%}
|
13
|
+
{%- assign tag_name = tag[0] -%}
|
14
|
+
{%- assign tag_count = tag | last | size -%}
|
15
|
+
{%comment%}
|
16
|
+
The font size of each tag is calculated using (a*x + b)%, where x
|
17
|
+
is the number of posts in that tag. This means that as x grows
|
18
|
+
the values of a and b in config.yml might need tweaking.
|
19
|
+
{%endcomment%}
|
20
|
+
{%- assign style = tag_count | times: a | plus: b | prepend: 'style="font-size: ' | append: '%;"' -%}
|
21
|
+
<a href={{ tag_name | prepend: '#' }} {{ style }} title="{{ tag_count }} posts">{{ tag_name | replace:'-', ' ' }}</a>
|
22
|
+
{%- if forloop.last == false %}, {% endif -%}
|
23
|
+
{%- endfor -%}
|
24
|
+
</div>
|
25
|
+
|
26
|
+
{%comment%} allows for preface before tag list {%endcomment%}
|
27
|
+
{{ content }}
|
28
|
+
|
29
|
+
{%- for tag in tags -%}
|
30
|
+
{%- capture tag_name -%}
|
31
|
+
{{ tag | first }}
|
32
|
+
{%- endcapture -%}
|
33
|
+
<h2 class="post-list-header">
|
34
|
+
<a id={{ tag_name }} href={{ tag_name | prepend: '#' }}>
|
35
|
+
{{ tag_name }}
|
36
|
+
</a>
|
37
|
+
</h2>
|
38
|
+
|
39
|
+
<ul class="post-list">
|
40
|
+
{%- for post in site.tags[tag_name] -%}
|
41
|
+
<li>
|
42
|
+
<a class="post-link" href="{{ post.url | relative_url }}">
|
43
|
+
{{ post.title | escape }}
|
44
|
+
</a>
|
45
|
+
{%- include meta.html -%}
|
46
|
+
{%- if site.show_list_excerpts -%}
|
47
|
+
{{ post.excerpt }}
|
48
|
+
{%- endif -%}
|
49
|
+
</li>
|
50
|
+
{%- endfor -%}
|
51
|
+
</ul>
|
52
|
+
{%- endfor -%}
|
53
|
+
|
54
|
+
</div>
|
@@ -0,0 +1,345 @@
|
|
1
|
+
// The content file controls the base styling of HTML content
|
2
|
+
// that Jekyll makes. Note that `layout.scss` tweaks some bits
|
3
|
+
// (e.g. headers) further for use in pages and posts.
|
4
|
+
|
5
|
+
|
6
|
+
// Setting Up
|
7
|
+
html {
|
8
|
+
font-size: $base-font-size;
|
9
|
+
// Reserves space for the scollbar even if not needed, which
|
10
|
+
// prevents the website interface shifting around when going
|
11
|
+
// between pages which do and don't need it.
|
12
|
+
overflow-y: scroll;
|
13
|
+
}
|
14
|
+
|
15
|
+
// Reset some basic elements
|
16
|
+
body, h1, h2, h3, h4, h5, h6,
|
17
|
+
p, blockquote, pre, hr,
|
18
|
+
dl, dd, ol, ul, figure {
|
19
|
+
margin: 0;
|
20
|
+
padding: 0;
|
21
|
+
}
|
22
|
+
|
23
|
+
|
24
|
+
// Basic Styling
|
25
|
+
// =============
|
26
|
+
|
27
|
+
body {
|
28
|
+
font: $base-font-weight #{$base-font-size}/#{$base-line-height} $base-font-family;
|
29
|
+
color: $text-color;
|
30
|
+
background-color: $background-color;
|
31
|
+
-webkit-text-size-adjust: 100%;
|
32
|
+
-webkit-font-feature-settings: "kern" 1;
|
33
|
+
-moz-font-feature-settings: "kern" 1;
|
34
|
+
-o-font-feature-settings: "kern" 1;
|
35
|
+
font-feature-settings: "kern" 1;
|
36
|
+
font-kerning: normal;
|
37
|
+
display: flex;
|
38
|
+
min-height: 100vh;
|
39
|
+
flex-direction: column;
|
40
|
+
overflow-wrap: break-word;
|
41
|
+
width: $content-width+$nav-bar-height;
|
42
|
+
max-width: 100%;
|
43
|
+
margin: 0 auto;
|
44
|
+
}
|
45
|
+
|
46
|
+
// Set `margin-bottom` to maintain vertical rhythm
|
47
|
+
h1, h2, h3, h4, h5, h6,
|
48
|
+
p, blockquote, pre,
|
49
|
+
ul, ol, dl, figure,
|
50
|
+
%vertical-rhythm {
|
51
|
+
margin-bottom: $spacing-unit / 2;
|
52
|
+
}
|
53
|
+
|
54
|
+
hr {
|
55
|
+
margin-top: $spacing-unit;
|
56
|
+
margin-bottom: $spacing-unit;
|
57
|
+
}
|
58
|
+
|
59
|
+
// `main` element
|
60
|
+
main {
|
61
|
+
display: block; // default is 'inline' in IE11
|
62
|
+
}
|
63
|
+
|
64
|
+
|
65
|
+
// Images
|
66
|
+
// ======
|
67
|
+
|
68
|
+
img {
|
69
|
+
max-width: 100%;
|
70
|
+
margin-bottom: $spacing-unit/2;
|
71
|
+
border-radius: $base-border-radius;
|
72
|
+
box-shadow: $base-shadow;
|
73
|
+
// Centres w/o text wrap on small displays
|
74
|
+
display: block;
|
75
|
+
margin-left: auto;
|
76
|
+
margin-right: auto;
|
77
|
+
@include if-large {
|
78
|
+
// Text wraps on large displays
|
79
|
+
vertical-align: middle;
|
80
|
+
display:inline;
|
81
|
+
}
|
82
|
+
}
|
83
|
+
|
84
|
+
img.left {
|
85
|
+
@include if-large {
|
86
|
+
float: left;
|
87
|
+
margin-right: $spacing-unit;
|
88
|
+
}
|
89
|
+
}
|
90
|
+
|
91
|
+
img.right {
|
92
|
+
@include if-large {
|
93
|
+
float: right;
|
94
|
+
margin-left: $spacing-unit;
|
95
|
+
}
|
96
|
+
}
|
97
|
+
|
98
|
+
figure > img {
|
99
|
+
display: block;
|
100
|
+
}
|
101
|
+
|
102
|
+
figcaption {
|
103
|
+
font-size: $small-font-size;
|
104
|
+
}
|
105
|
+
|
106
|
+
|
107
|
+
// Videos
|
108
|
+
// ======
|
109
|
+
|
110
|
+
.video-embed {
|
111
|
+
margin: 0 auto $spacing-unit/2 auto;
|
112
|
+
box-shadow: $base-shadow;
|
113
|
+
display: block;
|
114
|
+
max-width: 100%;
|
115
|
+
max-height: auto;
|
116
|
+
}
|
117
|
+
|
118
|
+
|
119
|
+
// Lists
|
120
|
+
// =====
|
121
|
+
|
122
|
+
ul, ol {
|
123
|
+
margin-left: $spacing-unit;
|
124
|
+
}
|
125
|
+
|
126
|
+
li {
|
127
|
+
> ul,
|
128
|
+
> ol {
|
129
|
+
margin-bottom: 0;
|
130
|
+
}
|
131
|
+
}
|
132
|
+
|
133
|
+
|
134
|
+
// Headings
|
135
|
+
// ========
|
136
|
+
|
137
|
+
h1, h2, h3, h4, h5, h6 {
|
138
|
+
font-weight: $base-header-weight;
|
139
|
+
}
|
140
|
+
|
141
|
+
h1 {
|
142
|
+
text-align: $base-h1-alignment;
|
143
|
+
// margin-bottom: $spacing-unit;
|
144
|
+
}
|
145
|
+
|
146
|
+
|
147
|
+
// Links
|
148
|
+
// =====
|
149
|
+
|
150
|
+
a {
|
151
|
+
color: $link-base-color;
|
152
|
+
text-decoration: none;
|
153
|
+
|
154
|
+
&:visited {
|
155
|
+
color: $link-visited-color;
|
156
|
+
}
|
157
|
+
|
158
|
+
&:hover {
|
159
|
+
color: $link-hover-color;
|
160
|
+
text-decoration: underline;
|
161
|
+
}
|
162
|
+
}
|
163
|
+
|
164
|
+
|
165
|
+
// Blockquotes
|
166
|
+
// ===========
|
167
|
+
|
168
|
+
blockquote {
|
169
|
+
color: $brand-color;
|
170
|
+
border-left: 4px solid $brand-color-light;
|
171
|
+
padding-left: $spacing-unit / 2;
|
172
|
+
@include relative-font-size(1.125);
|
173
|
+
font-style: italic;
|
174
|
+
|
175
|
+
> :last-child {
|
176
|
+
margin-bottom: 0;
|
177
|
+
}
|
178
|
+
|
179
|
+
i, em {
|
180
|
+
// Rather unitalicising, add a dotted underline
|
181
|
+
text-decoration: underline;
|
182
|
+
text-decoration-style: dotted;
|
183
|
+
}
|
184
|
+
}
|
185
|
+
|
186
|
+
|
187
|
+
// Code formatting
|
188
|
+
// ===============
|
189
|
+
|
190
|
+
pre,
|
191
|
+
code {
|
192
|
+
font-family: $code-font-family;
|
193
|
+
font-size: 0.9375em;
|
194
|
+
border: 1px solid $border-color;
|
195
|
+
box-shadow: $base-shadow;
|
196
|
+
border-radius: $base-border-radius/4;
|
197
|
+
background-color: $code-background-color;
|
198
|
+
}
|
199
|
+
|
200
|
+
code {
|
201
|
+
box-shadow: none;
|
202
|
+
padding: 1px 5px;
|
203
|
+
}
|
204
|
+
|
205
|
+
pre {
|
206
|
+
padding: 8px 12px;
|
207
|
+
overflow-x: auto;
|
208
|
+
|
209
|
+
> code {
|
210
|
+
border: 0;
|
211
|
+
padding-right: 0;
|
212
|
+
padding-left: 0;
|
213
|
+
}
|
214
|
+
}
|
215
|
+
|
216
|
+
.highlight {
|
217
|
+
border-radius: $base-border-radius;
|
218
|
+
background: $code-background-color;
|
219
|
+
@extend %vertical-rhythm;
|
220
|
+
|
221
|
+
.highlighter-rouge & {
|
222
|
+
background: $code-background-color;
|
223
|
+
}
|
224
|
+
|
225
|
+
// Syntax highlighting styles
|
226
|
+
.c { color: $syntax-comment-color; font-style: italic } // Comment
|
227
|
+
.err { color: $syntax-error-color; background-color: $syntax-err-background } // Error
|
228
|
+
.k { font-weight: bold } // Keyword
|
229
|
+
.o { font-weight: bold } // Operator
|
230
|
+
.cm { color: $syntax-comment-color; font-style: italic } // Comment.Multiline
|
231
|
+
.cp { color: $syntax-comment-color; font-weight: bold } // Comment.Preproc
|
232
|
+
.c1 { color: $syntax-comment-color; font-style: italic } // Comment.Single
|
233
|
+
.cs { color: $syntax-comment-color; font-weight: bold; font-style: italic } // Comment.Special
|
234
|
+
.gd { color: $syntax-ins-del-color; background-color: lighten($syntax-del-background, 10%) } // Generic.Deleted
|
235
|
+
.gd .x { color: $syntax-ins-del-color; background-color: $syntax-del-background } // Generic.Deleted.Specific
|
236
|
+
.ge { font-style: italic } // Generic.Emph
|
237
|
+
.gr { color: $syntax-error-color } // Generic.Error
|
238
|
+
.gh { color: $syntax-comment-color } // Generic.Heading
|
239
|
+
.gi { color: $syntax-ins-del-color; background-color: lighten($syntax-ins-background, 10%) } // Generic.Inserted
|
240
|
+
.gi .x { color: $syntax-ins-del-color; background-color: $syntax-ins-background } // Generic.Inserted.Specific
|
241
|
+
.go { color: $syntax-output-color } // Generic.Output
|
242
|
+
.gp { color: $syntax-prompt-color } // Generic.Prompt
|
243
|
+
.gs { font-weight: bold } // Generic.Strong
|
244
|
+
.gu { color: $syntax-subhead-color } // Generic.Subheading
|
245
|
+
.gt { color: $syntax-error-color } // Generic.Traceback
|
246
|
+
.kc { font-weight: bold } // Keyword.Constant
|
247
|
+
.kd { font-weight: bold } // Keyword.Declaration
|
248
|
+
.kp { font-weight: bold } // Keyword.Pseudo
|
249
|
+
.kr { font-weight: bold } // Keyword.Reserved
|
250
|
+
.kt { color: $syntax-class-color; font-weight: bold } // Keyword.Type
|
251
|
+
.m { color: $syntax-number-color } // Literal.Number
|
252
|
+
.s { color: $syntax-string-color } // Literal.String
|
253
|
+
.na { color: $syntax-variable-color } // Name.Attribute
|
254
|
+
.nb { color: $syntax-builtin-color } // Name.Builtin
|
255
|
+
.nc { color: $syntax-class-color; font-weight: bold } // Name.Class
|
256
|
+
.no { color: $syntax-variable-color } // Name.Constant
|
257
|
+
.ni { color: $syntax-entity-color } // Name.Entity
|
258
|
+
.ne { color: $syntax-error-color; font-weight: bold } // Name.Exception
|
259
|
+
.nf { color: $syntax-function-color; font-weight: bold } // Name.Function
|
260
|
+
.nn { color: $syntax-prompt-color } // Name.Namespace
|
261
|
+
.nt { color: $syntax-tag-color } // Name.Tag
|
262
|
+
.nv { color: $syntax-variable-color } // Name.Variable
|
263
|
+
.ow { font-weight: bold } // Operator.Word
|
264
|
+
.w { color: $syntax-whitespace-color } // Text.Whitespace
|
265
|
+
.mf { color: $syntax-number-color } // Literal.Number.Float
|
266
|
+
.mh { color: $syntax-number-color } // Literal.Number.Hex
|
267
|
+
.mi { color: $syntax-number-color } // Literal.Number.Integer
|
268
|
+
.mo { color: $syntax-number-color } // Literal.Number.Oct
|
269
|
+
.sb { color: $syntax-string-color } // Literal.String.Backtick
|
270
|
+
.sc { color: $syntax-string-color } // Literal.String.Char
|
271
|
+
.sd { color: $syntax-string-color } // Literal.String.Doc
|
272
|
+
.s2 { color: $syntax-string-color } // Literal.String.Double
|
273
|
+
.se { color: $syntax-string-color } // Literal.String.Escape
|
274
|
+
.sh { color: $syntax-string-color } // Literal.String.Heredoc
|
275
|
+
.si { color: $syntax-string-color } // Literal.String.Interpol
|
276
|
+
.sx { color: $syntax-string-color } // Literal.String.Other
|
277
|
+
.sr { color: $syntax-regex-color } // Literal.String.Regex
|
278
|
+
.s1 { color: $syntax-string-color } // Literal.String.Single
|
279
|
+
.ss { color: $syntax-symbol-color } // Literal.String.Symbol
|
280
|
+
.bp { color: $syntax-comment-color } // Name.Builtin.Pseudo
|
281
|
+
.vc { color: $syntax-variable-color } // Name.Variable.Class
|
282
|
+
.vg { color: $syntax-variable-color } // Name.Variable.Global
|
283
|
+
.vi { color: $syntax-variable-color } // Name.Variable.Instance
|
284
|
+
.il { color: $syntax-number-color } // Literal.Number.Integer.Long
|
285
|
+
}
|
286
|
+
|
287
|
+
|
288
|
+
// Clearfix
|
289
|
+
// ========
|
290
|
+
|
291
|
+
%clearfix:after {
|
292
|
+
content: "";
|
293
|
+
display: table;
|
294
|
+
clear: both;
|
295
|
+
}
|
296
|
+
|
297
|
+
|
298
|
+
// Table Formatting
|
299
|
+
// ================
|
300
|
+
|
301
|
+
table {
|
302
|
+
margin-bottom: $spacing-unit;
|
303
|
+
width: 100%;
|
304
|
+
text-align: $table-text-align;
|
305
|
+
color: $table-text-color;
|
306
|
+
border-collapse: collapse;
|
307
|
+
|
308
|
+
// Properties for the table's external border
|
309
|
+
border: 1px solid $table-border-color;
|
310
|
+
border-radius: $base-border-radius;
|
311
|
+
box-shadow: $base-shadow;
|
312
|
+
|
313
|
+
// Properties for the table's internal borders
|
314
|
+
th, td {
|
315
|
+
// All cells have the same padding rules
|
316
|
+
padding: ($spacing-unit / 3) ($spacing-unit / 2);
|
317
|
+
}
|
318
|
+
tr {
|
319
|
+
// Alternate row background colours
|
320
|
+
&:nth-child(even) {
|
321
|
+
background-color: $table-zebra-color;
|
322
|
+
}
|
323
|
+
// Internal vertical borders
|
324
|
+
border-bottom: 1px solid $table-border-color;
|
325
|
+
&:last-of-type { border-bottom: 0; }
|
326
|
+
}
|
327
|
+
td {
|
328
|
+
// Internal horizontal borders
|
329
|
+
border-right: 1px solid $table-border-color;
|
330
|
+
&:last-of-type { border-right: 0; }
|
331
|
+
}
|
332
|
+
th {
|
333
|
+
// Table header has its own colour properties
|
334
|
+
background-color: $table-header-bg-color;
|
335
|
+
border-bottom: 1px solid $table-header-border;
|
336
|
+
border-right: 1px solid $table-header-border;
|
337
|
+
&:last-of-type { border-right: 0; }
|
338
|
+
}
|
339
|
+
|
340
|
+
// Handle overflow if there isn't enough space to display
|
341
|
+
display: block;
|
342
|
+
overflow-x: auto;
|
343
|
+
-webkit-overflow-scrolling: touch;
|
344
|
+
-ms-overflow-style: -ms-autohiding-scrollbar;
|
345
|
+
}
|