slipway-theme 0.1.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 +7 -0
- data/LICENSE +21 -0
- data/_includes/analytics.html +12 -0
- data/_includes/author-card.html +29 -0
- data/_includes/author-ids.html +2 -0
- data/_includes/author-url.html +11 -0
- data/_includes/breadcrumbs.html +67 -0
- data/_includes/byline.html +14 -0
- data/_includes/compat.html +11 -0
- data/_includes/component-css.html +5 -0
- data/_includes/copy-page.html +5 -0
- data/_includes/date.html +90 -0
- data/_includes/dir.html +4 -0
- data/_includes/edit-sources.html +25 -0
- data/_includes/feedback.html +12 -0
- data/_includes/footer-custom.html +5 -0
- data/_includes/footer.html +16 -0
- data/_includes/head-custom.html +5 -0
- data/_includes/head.html +52 -0
- data/_includes/header.html +38 -0
- data/_includes/i18n/ar.html +43 -0
- data/_includes/i18n/de.html +43 -0
- data/_includes/i18n/en.html +43 -0
- data/_includes/i18n/es.html +43 -0
- data/_includes/i18n/fa.html +43 -0
- data/_includes/i18n/fr.html +43 -0
- data/_includes/i18n/he.html +42 -0
- data/_includes/i18n/it.html +43 -0
- data/_includes/i18n/ja.html +43 -0
- data/_includes/i18n/nl.html +43 -0
- data/_includes/i18n/pt.html +43 -0
- data/_includes/i18n/ru.html +43 -0
- data/_includes/i18n/tr.html +43 -0
- data/_includes/i18n/zh.html +43 -0
- data/_includes/i18n-builtin.html +8 -0
- data/_includes/icons/github.svg +1 -0
- data/_includes/icons/linkedin.svg +1 -0
- data/_includes/icons/mastodon.svg +1 -0
- data/_includes/icons/twitter.svg +1 -0
- data/_includes/icons/x.svg +1 -0
- data/_includes/icons/youtube.svg +1 -0
- data/_includes/jsonld.html +41 -0
- data/_includes/lang-switcher.html +15 -0
- data/_includes/layout-url.html +8 -0
- data/_includes/llms-item.html +19 -0
- data/_includes/num.html +3 -0
- data/_includes/post-item.html +4 -0
- data/_includes/related-posts.html +37 -0
- data/_includes/search.html +13 -0
- data/_includes/seo.html +42 -0
- data/_includes/series.html +47 -0
- data/_includes/skip-link.html +1 -0
- data/_includes/t.html +4 -0
- data/_includes/taxonomy.html +22 -0
- data/_includes/term.html +7 -0
- data/_includes/theme-init.html +1 -0
- data/_includes/theme-var.html +4 -0
- data/_includes/theme-vars.html +17 -0
- data/_layouts/archive.html +32 -0
- data/_layouts/author.html +31 -0
- data/_layouts/base.html +19 -0
- data/_layouts/default.html +4 -0
- data/_layouts/doc.html +89 -0
- data/_layouts/feed.html +37 -0
- data/_layouts/glossary.html +23 -0
- data/_layouts/home.html +96 -0
- data/_layouts/llms-full.html +54 -0
- data/_layouts/llms.html +32 -0
- data/_layouts/not-found.html +27 -0
- data/_layouts/page.html +13 -0
- data/_layouts/post.html +72 -0
- data/_layouts/search-index.html +12 -0
- data/_layouts/sitemap.html +24 -0
- data/_layouts/sourcemap.html +28 -0
- data/_layouts/tags.html +24 -0
- data/_layouts/translation-status.html +44 -0
- data/assets/css/components/glossary.css +21 -0
- data/assets/css/fonts.css +47 -0
- data/assets/css/nav.css +104 -0
- data/assets/css/print.css +70 -0
- data/assets/css/slipway.css +952 -0
- data/assets/css/tokens.css +57 -0
- data/assets/fonts/LICENSES/InstrumentSerif-OFL.txt +93 -0
- data/assets/fonts/LICENSES/SourceSerif4-OFL.txt +93 -0
- data/assets/fonts/LICENSES/Vazirmatn-OFL.txt +93 -0
- data/assets/fonts/instrument-serif-latin-400-italic.woff2 +0 -0
- data/assets/fonts/instrument-serif-latin-400-normal.woff2 +0 -0
- data/assets/fonts/source-serif-4-latin-wght-italic.woff2 +0 -0
- data/assets/fonts/source-serif-4-latin-wght-normal.woff2 +0 -0
- data/assets/fonts/vazirmatn-arabic-wght-normal.woff2 +0 -0
- data/assets/images/social.png +0 -0
- data/assets/js/copy-code.js +53 -0
- data/assets/js/edit-prompt.js +23 -0
- data/assets/js/search.js +114 -0
- data/assets/js/theme-toggle.js +66 -0
- metadata +156 -0
data/_includes/seo.html
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{%- comment %} Canonical, Open Graph, Twitter card, and hreflang alternates. Plain Liquid, so classic Pages needs no jekyll-seo-tag. Expects sl_desc from head.html. {% endcomment %}
|
|
2
|
+
{%- assign sl_seo_lang = page.lang | default: site.lang | default: 'en' %}
|
|
3
|
+
{%- assign sl_seo_url = page.url | absolute_url %}
|
|
4
|
+
{%- assign sl_seo_title = page.title | default: site.title %}
|
|
5
|
+
<link rel="canonical" href="{{ sl_seo_url }}">
|
|
6
|
+
<meta property="og:type" content="{% if page.collection == 'posts' %}article{% else %}website{% endif %}">
|
|
7
|
+
<meta property="og:url" content="{{ sl_seo_url }}">
|
|
8
|
+
{%- if sl_seo_title %}
|
|
9
|
+
<meta property="og:title" content="{{ sl_seo_title | escape }}">
|
|
10
|
+
{%- endif %}
|
|
11
|
+
{%- if site.title %}
|
|
12
|
+
<meta property="og:site_name" content="{{ site.title | escape }}">
|
|
13
|
+
{%- endif %}
|
|
14
|
+
{%- if sl_desc != '' %}
|
|
15
|
+
<meta property="og:description" content="{{ sl_desc | escape }}">
|
|
16
|
+
{%- endif %}
|
|
17
|
+
<meta property="og:image" content="{{ '/assets/images/social.png' | absolute_url }}">
|
|
18
|
+
<meta property="og:image:width" content="1200">
|
|
19
|
+
<meta property="og:image:height" content="630">
|
|
20
|
+
<meta property="og:locale" content="{{ sl_seo_lang | replace: '-', '_' }}">
|
|
21
|
+
{%- if page.collection == 'posts' and page.date %}
|
|
22
|
+
<meta property="article:published_time" content="{{ page.date | date_to_xmlschema }}">
|
|
23
|
+
{%- for tag in page.tags %}
|
|
24
|
+
<meta property="article:tag" content="{{ tag | escape }}">
|
|
25
|
+
{%- endfor %}
|
|
26
|
+
{%- endif %}
|
|
27
|
+
<meta name="twitter:card" content="summary">
|
|
28
|
+
{%- if page.translation_key %}
|
|
29
|
+
{%- assign sl_seo_alts = site.pages | concat: site.documents | where: 'translation_key', page.translation_key %}
|
|
30
|
+
{%- if sl_seo_alts.size > 1 %}
|
|
31
|
+
{%- for alt in sl_seo_alts %}
|
|
32
|
+
{%- assign sl_alt_lang = alt.lang | default: site.lang | default: 'en' %}
|
|
33
|
+
<link rel="alternate" hreflang="{{ sl_alt_lang }}" href="{{ alt.url | absolute_url }}">
|
|
34
|
+
{%- if sl_alt_lang != sl_seo_lang %}
|
|
35
|
+
<meta property="og:locale:alternate" content="{{ sl_alt_lang | replace: '-', '_' }}">
|
|
36
|
+
{%- endif %}
|
|
37
|
+
{%- if sl_alt_lang == site.lang %}
|
|
38
|
+
<link rel="alternate" hreflang="x-default" href="{{ alt.url | absolute_url }}">
|
|
39
|
+
{%- endif %}
|
|
40
|
+
{%- endfor %}
|
|
41
|
+
{%- endif %}
|
|
42
|
+
{%- endif %}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{%- comment -%} The series box of a post: every post with the same `series` in the same language, oldest first, this post's part, and the previous and next part. Prints nothing when the post is alone in its series. {%- endcomment -%}
|
|
2
|
+
{%- if page.series -%}
|
|
3
|
+
{%- assign sl_s_lang = page.lang | default: site.lang | default: 'en' -%}
|
|
4
|
+
{%- assign sl_s_all = site.posts | where: 'series', page.series | reverse -%}
|
|
5
|
+
{%- assign sl_s_posts = '' | split: '' -%}
|
|
6
|
+
{%- for post in sl_s_all -%}
|
|
7
|
+
{%- assign sl_s_post_lang = post.lang | default: site.lang | default: 'en' -%}
|
|
8
|
+
{%- if sl_s_post_lang == sl_s_lang %}{% assign sl_s_posts = sl_s_posts | push: post %}{% endif -%}
|
|
9
|
+
{%- endfor -%}
|
|
10
|
+
{%- assign sl_s_index = 0 -%}
|
|
11
|
+
{%- for post in sl_s_posts -%}
|
|
12
|
+
{%- if post.url == page.url %}{% assign sl_s_index = forloop.index %}{% endif -%}
|
|
13
|
+
{%- endfor -%}
|
|
14
|
+
{%- if sl_s_index > 0 and sl_s_posts.size > 1 -%}
|
|
15
|
+
{%- assign sl_s_prev = nil -%}
|
|
16
|
+
{%- assign sl_s_next = nil -%}
|
|
17
|
+
{%- if sl_s_index > 1 %}{% assign sl_s_i = sl_s_index | minus: 2 %}{% assign sl_s_prev = sl_s_posts[sl_s_i] %}{% endif -%}
|
|
18
|
+
{%- if sl_s_index < sl_s_posts.size %}{% assign sl_s_next = sl_s_posts[sl_s_index] %}{% endif -%}
|
|
19
|
+
{%- capture sl_s_n %}{% include num.html value=sl_s_index %}{% endcapture -%}
|
|
20
|
+
{%- capture sl_s_total %}{% include num.html value=sl_s_posts.size %}{% endcapture -%}
|
|
21
|
+
{%- capture sl_s_part %}{% include t.html key='series_part' %}{% endcapture -%}
|
|
22
|
+
{%- assign sl_s_ph_n = '{n}' -%}
|
|
23
|
+
{%- assign sl_s_ph_total = '{total}' -%}
|
|
24
|
+
{%- assign sl_s_part = sl_s_part | replace: sl_s_ph_n, sl_s_n | replace: sl_s_ph_total, sl_s_total %}
|
|
25
|
+
<aside class="sl-series" aria-labelledby="sl-series-title">
|
|
26
|
+
<p class="sl-series-title" id="sl-series-title"><span>{% include t.html key='series' %}</span> {{ page.series | escape }}</p>
|
|
27
|
+
<p class="sl-series-part">{{ sl_s_part }}</p>
|
|
28
|
+
<ol class="sl-series-list">
|
|
29
|
+
{%- for post in sl_s_posts %}
|
|
30
|
+
{%- if forloop.index == sl_s_index %}
|
|
31
|
+
<li aria-current="page">{{ post.title }}</li>
|
|
32
|
+
{%- else %}
|
|
33
|
+
<li><a href="{{ post.url | relative_url }}">{{ post.title }}</a></li>
|
|
34
|
+
{%- endif %}
|
|
35
|
+
{%- endfor %}
|
|
36
|
+
</ol>
|
|
37
|
+
<nav class="sl-series-pager" aria-label="{% include t.html key='series_pager' %}">
|
|
38
|
+
{%- if sl_s_prev %}
|
|
39
|
+
<a class="sl-series-prev" href="{{ sl_s_prev.url | relative_url }}"><span>{% include t.html key='previous' %}</span> {{ sl_s_prev.title }}</a>
|
|
40
|
+
{%- endif %}
|
|
41
|
+
{%- if sl_s_next %}
|
|
42
|
+
<a class="sl-series-next" href="{{ sl_s_next.url | relative_url }}"><span>{% include t.html key='next' %}</span> {{ sl_s_next.title }}</a>
|
|
43
|
+
{%- endif %}
|
|
44
|
+
</nav>
|
|
45
|
+
</aside>
|
|
46
|
+
{%- endif -%}
|
|
47
|
+
{%- endif -%}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<a class="sl-skip-link" href="#main">{% include t.html key='skip' %}</a>
|
data/_includes/t.html
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
{%- assign sl_t_lang = include.lang | default: page.lang | default: site.lang | default: 'en' -%}
|
|
2
|
+
{%- assign sl_t_base = sl_t_lang | split: '-' | first -%}
|
|
3
|
+
{%- assign sl_t_value = site.data.i18n[sl_t_lang][include.key] | default: site.data.i18n[sl_t_base][include.key] -%}
|
|
4
|
+
{%- if sl_t_value -%}{{ sl_t_value }}{%- else -%}{% include i18n-builtin.html lang=sl_t_base key=include.key %}{%- endif -%}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{%- comment -%}
|
|
2
|
+
One section per term of include.terms (site.tags or site.categories), with the posts of the current language.
|
|
3
|
+
include.kind is "tag" or "category"; headings get the id "<kind>-<slug>" so posts can link to them.
|
|
4
|
+
{%- endcomment -%}
|
|
5
|
+
{%- assign sl_x_lang = page.lang | default: site.lang | default: 'en' -%}
|
|
6
|
+
{%- assign sl_x_pairs = include.terms | sort -%}
|
|
7
|
+
{%- for pair in sl_x_pairs -%}
|
|
8
|
+
{%- assign sl_x_count = 0 -%}
|
|
9
|
+
{%- capture sl_x_items -%}
|
|
10
|
+
{%- for post in pair[1] -%}
|
|
11
|
+
{%- assign sl_x_post_lang = post.lang | default: site.lang | default: 'en' -%}
|
|
12
|
+
{%- if sl_x_post_lang != sl_x_lang %}{% continue %}{% endif -%}
|
|
13
|
+
{%- assign sl_x_count = sl_x_count | plus: 1 %}
|
|
14
|
+
{% include post-item.html post=post %}
|
|
15
|
+
{%- endfor -%}
|
|
16
|
+
{%- endcapture -%}
|
|
17
|
+
{%- if sl_x_count > 0 %}
|
|
18
|
+
<h3 id="{{ include.kind }}-{{ pair[0] | slugify }}">{{ pair[0] }} <span class="sl-count">({% include num.html value=sl_x_count %})</span></h3>
|
|
19
|
+
<ul class="sl-post-list">{{ sl_x_items }}
|
|
20
|
+
</ul>
|
|
21
|
+
{%- endif -%}
|
|
22
|
+
{%- endfor -%}
|
data/_includes/term.html
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{%- comment -%} Renders a link to a glossary term. {%- endcomment -%}
|
|
2
|
+
{%- assign sl_term = site.data.glossary | where: "id", include.id | first -%}
|
|
3
|
+
{%- if sl_term -%}
|
|
4
|
+
{%- include component-css.html name="glossary" -%}
|
|
5
|
+
{%- capture sl_glossary_url -%}{% include layout-url.html layout="glossary" %}{%- endcapture -%}
|
|
6
|
+
<a href="{{ sl_glossary_url | strip }}#{{ sl_term.id }}" class="sl-term" title="{{ sl_term.definition | escape }}">{{ sl_term.term }}</a>
|
|
7
|
+
{%- endif -%}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<script>try{var t=localStorage.getItem("slipway-theme");if(t==="light"||t==="dark")document.documentElement.dataset.theme=t}catch(e){}</script>
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{%- assign t = site.slipway.tokens -%}
|
|
2
|
+
{%- assign fonts = site.slipway.fonts -%}
|
|
3
|
+
{%- if t or fonts == "system" -%}
|
|
4
|
+
<style>:root {
|
|
5
|
+
{%- if fonts == "system" -%}
|
|
6
|
+
--sl-font-display: var(--sl-font-ui);
|
|
7
|
+
--sl-font-body: var(--sl-font-ui);
|
|
8
|
+
--sl-font-persian: var(--sl-font-arabic);
|
|
9
|
+
{%- endif -%}
|
|
10
|
+
{%- include theme-var.html name="--sl-color-rose" value=t.accent -%}
|
|
11
|
+
{%- include theme-var.html name="--sl-color-rose-fill" value=t.accent -%}
|
|
12
|
+
{%- include theme-var.html name="--sl-color-canvas" value=t.canvas -%}
|
|
13
|
+
{%- include theme-var.html name="--sl-color-text" value=t.text -%}
|
|
14
|
+
{%- include theme-var.html name="--sl-font-display" value=t.font_display -%}
|
|
15
|
+
{%- include theme-var.html name="--sl-font-body" value=t.font_body -%}
|
|
16
|
+
{%- include theme-var.html name="--sl-radius-card" value=t.radius %} }</style>
|
|
17
|
+
{%- endif -%}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
---
|
|
2
|
+
layout: base
|
|
3
|
+
---
|
|
4
|
+
{%- assign sl_lang = page.lang | default: site.lang | default: 'en' -%}
|
|
5
|
+
<article class="sl-page">
|
|
6
|
+
<header class="sl-page-header">
|
|
7
|
+
<h1>{{ page.title }}</h1>
|
|
8
|
+
{%- if page.description %}
|
|
9
|
+
<p class="sl-page-lead">{{ page.description }}</p>
|
|
10
|
+
{%- endif %}
|
|
11
|
+
</header>
|
|
12
|
+
{{ content }}
|
|
13
|
+
{%- comment -%} Posts come newest first; a new heading starts whenever the year (Jalali when opted in) changes. {%- endcomment %}
|
|
14
|
+
{%- assign sl_year = '' -%}
|
|
15
|
+
{%- for post in site.posts -%}
|
|
16
|
+
{%- assign sl_post_lang = post.lang | default: site.lang | default: 'en' -%}
|
|
17
|
+
{%- if sl_post_lang != sl_lang %}{% continue %}{% endif -%}
|
|
18
|
+
{%- capture sl_date_unused %}{% include date.html date=post.date %}{% endcapture -%}
|
|
19
|
+
{%- if sl_d_year != sl_year -%}
|
|
20
|
+
{%- unless sl_year == '' %}
|
|
21
|
+
</ul>
|
|
22
|
+
{%- endunless %}
|
|
23
|
+
<h2 id="year-{{ sl_d_year }}">{% include num.html value=sl_d_year %}</h2>
|
|
24
|
+
<ul class="sl-post-list">
|
|
25
|
+
{%- assign sl_year = sl_d_year -%}
|
|
26
|
+
{%- endif %}
|
|
27
|
+
{% include post-item.html post=post %}
|
|
28
|
+
{%- endfor %}
|
|
29
|
+
{%- unless sl_year == '' %}
|
|
30
|
+
</ul>
|
|
31
|
+
{%- endunless %}
|
|
32
|
+
</article>
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
---
|
|
2
|
+
layout: base
|
|
3
|
+
---
|
|
4
|
+
{%- comment -%} One author's page: `author` in the front matter is a key of _data/authors.yml. Lists that author's posts in the page's language. {%- endcomment -%}
|
|
5
|
+
{%- assign sl_lang = page.lang | default: site.lang | default: 'en' -%}
|
|
6
|
+
<article class="sl-page">
|
|
7
|
+
<header class="sl-page-header">
|
|
8
|
+
<h1>{{ page.title }}</h1>
|
|
9
|
+
{%- if page.description %}
|
|
10
|
+
<p class="sl-page-lead">{{ page.description }}</p>
|
|
11
|
+
{%- endif %}
|
|
12
|
+
{% include author-card.html id=page.author %}
|
|
13
|
+
</header>
|
|
14
|
+
{{ content }}
|
|
15
|
+
{%- assign sl_count = 0 -%}
|
|
16
|
+
{%- capture sl_items -%}
|
|
17
|
+
{%- for post in site.posts -%}
|
|
18
|
+
{%- assign sl_post_lang = post.lang | default: site.lang | default: 'en' -%}
|
|
19
|
+
{%- if sl_post_lang != sl_lang %}{% continue %}{% endif -%}
|
|
20
|
+
{%- include author-ids.html page=post -%}
|
|
21
|
+
{%- unless sl_ai_ids contains page.author %}{% continue %}{% endunless -%}
|
|
22
|
+
{%- assign sl_count = sl_count | plus: 1 %}
|
|
23
|
+
{% include post-item.html post=post %}
|
|
24
|
+
{%- endfor -%}
|
|
25
|
+
{%- endcapture -%}
|
|
26
|
+
{%- if sl_count > 0 %}
|
|
27
|
+
<h2 id="posts">{% include t.html key='posts' %} <span class="sl-count">({% include num.html value=sl_count %})</span></h2>
|
|
28
|
+
<ul class="sl-post-list">{{ sl_items }}
|
|
29
|
+
</ul>
|
|
30
|
+
{%- endif %}
|
|
31
|
+
</article>
|
data/_layouts/base.html
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{%- assign sl_lang = page.lang | default: site.lang | default: 'en' -%}
|
|
2
|
+
{%- assign sl_base = sl_lang | split: '-' | first -%}
|
|
3
|
+
{%- assign sl_dir = page.direction | default: site.direction -%}
|
|
4
|
+
{%- unless sl_dir -%}
|
|
5
|
+
{%- capture sl_dir %}{% include dir.html lang=sl_lang %}{% endcapture -%}
|
|
6
|
+
{%- endunless -%}
|
|
7
|
+
<!doctype html>
|
|
8
|
+
<html lang="{{ sl_lang }}" dir="{{ sl_dir }}">
|
|
9
|
+
{% include head.html %}
|
|
10
|
+
<body{% if sl_base == 'fa' and site.slipway.persian.digits %} class="sl-fa-digits"{% elsif sl_base == 'ar' and site.slipway.arabic.digits %} class="sl-ar-digits"{% endif %} data-copy="{% include t.html key='copy' %}" data-copied="{% include t.html key='copied' %}" data-copy-failed="{% include t.html key='copy_failed' %}">
|
|
11
|
+
{% include skip-link.html %}
|
|
12
|
+
{% include header.html %}
|
|
13
|
+
{%- assign sl_width = page.width | downcase -%}
|
|
14
|
+
<main id="main" class="sl-sections sl-layout-{{ page.layout }}{% if sl_width == 'narrow' or sl_width == 'wide' or sl_width == 'full' %} sl-width-{{ sl_width }}{% endif %}" tabindex="-1">
|
|
15
|
+
{{ content }}
|
|
16
|
+
</main>
|
|
17
|
+
{% include footer.html %}
|
|
18
|
+
</body>
|
|
19
|
+
</html>
|
data/_layouts/doc.html
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
---
|
|
2
|
+
layout: base
|
|
3
|
+
---
|
|
4
|
+
{%- capture sl_edit_label %}{% include t.html key='edit_label' %}{% endcapture -%}
|
|
5
|
+
{%- capture sl_edit_prompt %}{% include t.html key='edit_prompt' %}{% endcapture -%}
|
|
6
|
+
{%- assign sl_nav_lang = page.lang | default: site.lang | default: 'en' | split: '-' | first -%}
|
|
7
|
+
{%- assign sl_nav_key = 'docs_' | append: sl_nav_lang -%}
|
|
8
|
+
{%- assign sl_tree = site.data.navigation[sl_nav_key] | default: site.data.navigation.docs -%}
|
|
9
|
+
{%- comment -%} Flatten the leaves, in reading order, to "url||title" entries for the previous/next links. {%- endcomment -%}
|
|
10
|
+
{%- capture sl_flat_text -%}
|
|
11
|
+
{%- for item in sl_tree -%}
|
|
12
|
+
{%- if item.children -%}
|
|
13
|
+
{%- for child in item.children -%}{{ child.url }}||{{ child.title }}@@{%- endfor -%}
|
|
14
|
+
{%- else -%}{{ item.url }}||{{ item.title }}@@{%- endif -%}
|
|
15
|
+
{%- endfor -%}
|
|
16
|
+
{%- endcapture -%}
|
|
17
|
+
{%- assign sl_items = sl_flat_text | split: '@@' -%}
|
|
18
|
+
{%- assign sl_index = -1 -%}
|
|
19
|
+
{%- for entry in sl_items -%}
|
|
20
|
+
{%- assign sl_entry_url = entry | split: '||' | first -%}
|
|
21
|
+
{%- if sl_entry_url == page.url %}{% assign sl_index = forloop.index0 %}{% endif -%}
|
|
22
|
+
{%- endfor -%}
|
|
23
|
+
<div class="sl-doc">
|
|
24
|
+
{%- if sl_tree.size > 0 %}
|
|
25
|
+
<details class="sl-doc-nav">
|
|
26
|
+
<summary>{% include t.html key='docs_nav' %}</summary>
|
|
27
|
+
<nav aria-label="{% include t.html key='docs_nav' %}">
|
|
28
|
+
<ul>
|
|
29
|
+
{%- for item in sl_tree %}
|
|
30
|
+
{%- if item.children %}
|
|
31
|
+
<li class="sl-doc-group">{{ item.title }}
|
|
32
|
+
<ul>
|
|
33
|
+
{%- for child in item.children %}
|
|
34
|
+
<li><a href="{{ child.url | relative_url }}"{% if child.url == page.url %} aria-current="page"{% endif %}>{{ child.title }}</a></li>
|
|
35
|
+
{%- endfor %}
|
|
36
|
+
</ul>
|
|
37
|
+
</li>
|
|
38
|
+
{%- else %}
|
|
39
|
+
<li><a href="{{ item.url | relative_url }}"{% if item.url == page.url %} aria-current="page"{% endif %}>{{ item.title }}</a></li>
|
|
40
|
+
{%- endif %}
|
|
41
|
+
{%- endfor %}
|
|
42
|
+
</ul>
|
|
43
|
+
</nav>
|
|
44
|
+
</details>
|
|
45
|
+
{%- endif %}
|
|
46
|
+
|
|
47
|
+
<article class="sl-doc-body" data-edit-label="{{ sl_edit_label | escape }}" data-edit-prompt="{{ sl_edit_prompt | escape }}">
|
|
48
|
+
{% include breadcrumbs.html %}
|
|
49
|
+
<h1>{{ page.title }}</h1>{% include copy-page.html %}
|
|
50
|
+
{%- assign sl_parts = content | split: '<h' -%}
|
|
51
|
+
{%- capture sl_toc_html -%}
|
|
52
|
+
{%- for part in sl_parts offset: 1 -%}
|
|
53
|
+
{%- assign sl_level = part | slice: 0, 1 -%}
|
|
54
|
+
{%- if sl_level == '2' or sl_level == '3' -%}
|
|
55
|
+
{%- assign sl_head = part | split: '</h' | first -%}
|
|
56
|
+
{%- assign sl_id = sl_head | split: 'id="' | last | split: '"' | first -%}
|
|
57
|
+
{%- if sl_head contains 'id="' %}
|
|
58
|
+
<li class="sl-toc-{{ sl_level }}"><a href="#{{ sl_id }}">{{ sl_head | split: '">' | last | strip_html }}</a></li>
|
|
59
|
+
{%- endif -%}
|
|
60
|
+
{%- endif -%}
|
|
61
|
+
{%- endfor -%}
|
|
62
|
+
{%- endcapture -%}
|
|
63
|
+
{%- assign sl_toc_trim = sl_toc_html | strip -%}
|
|
64
|
+
{%- if sl_toc_trim != '' %}
|
|
65
|
+
<nav class="sl-toc" aria-label="{% include t.html key='on_this_page' %}">
|
|
66
|
+
<p class="sl-toc-title">{% include t.html key='on_this_page' %}</p>
|
|
67
|
+
<ul>{{ sl_toc_html }}
|
|
68
|
+
</ul>
|
|
69
|
+
</nav>
|
|
70
|
+
{%- endif %}
|
|
71
|
+
{% include edit-sources.html html=content %}
|
|
72
|
+
{% include feedback.html %}
|
|
73
|
+
|
|
74
|
+
{%- if sl_index >= 0 %}
|
|
75
|
+
{%- assign sl_prev_index = sl_index | minus: 1 -%}
|
|
76
|
+
{%- assign sl_next_index = sl_index | plus: 1 %}
|
|
77
|
+
<nav class="sl-pager" aria-label="{% include t.html key='pager' %}">
|
|
78
|
+
{%- if sl_index > 0 %}
|
|
79
|
+
{%- assign sl_prev = sl_items[sl_prev_index] | split: '||' %}
|
|
80
|
+
<a class="sl-pager-prev" rel="prev" href="{{ sl_prev[0] | relative_url }}"><span>{% include t.html key='previous' %}</span> {{ sl_prev[1] }}</a>
|
|
81
|
+
{%- endif %}
|
|
82
|
+
{%- if sl_next_index < sl_items.size and sl_items[sl_next_index] != '' %}
|
|
83
|
+
{%- assign sl_next = sl_items[sl_next_index] | split: '||' %}
|
|
84
|
+
<a class="sl-pager-next" rel="next" href="{{ sl_next[0] | relative_url }}"><span>{% include t.html key='next' %}</span> {{ sl_next[1] }}</a>
|
|
85
|
+
{%- endif %}
|
|
86
|
+
</nav>
|
|
87
|
+
{%- endif %}
|
|
88
|
+
</article>
|
|
89
|
+
</div>
|
data/_layouts/feed.html
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{%- assign sl_f_lang = page.lang | default: site.lang | default: 'en' -%}
|
|
2
|
+
{%- assign sl_f_prefix = '' -%}
|
|
3
|
+
{%- for l in site.slipway.languages -%}
|
|
4
|
+
{%- if l.code == sl_f_lang -%}{%- assign sl_f_prefix = l.prefix -%}{%- endif -%}
|
|
5
|
+
{%- endfor -%}
|
|
6
|
+
{%- assign sl_f_count = 0 -%}
|
|
7
|
+
{%- assign sl_f_updated = site.time -%}
|
|
8
|
+
{%- capture sl_f_entries -%}
|
|
9
|
+
{%- for post in site.posts -%}
|
|
10
|
+
{%- assign sl_f_post_lang = post.lang | default: site.lang | default: 'en' -%}
|
|
11
|
+
{%- if sl_f_post_lang != sl_f_lang %}{% continue %}{% endif -%}
|
|
12
|
+
{%- if sl_f_count == 0 %}{% assign sl_f_updated = post.last_modified_at | default: post.date %}{% endif -%}
|
|
13
|
+
{%- if sl_f_count == 20 %}{% break %}{% endif -%}
|
|
14
|
+
{%- assign sl_f_count = sl_f_count | plus: 1 %}
|
|
15
|
+
<entry>
|
|
16
|
+
<title>{{ post.title | xml_escape }}</title>
|
|
17
|
+
<link href="{{ post.url | absolute_url }}" rel="alternate" type="text/html"/>
|
|
18
|
+
<id>{{ post.url | absolute_url }}</id>
|
|
19
|
+
<published>{{ post.date | date_to_xmlschema }}</published>
|
|
20
|
+
<updated>{{ post.last_modified_at | default: post.date | date_to_xmlschema }}</updated>
|
|
21
|
+
{%- if post.description %}
|
|
22
|
+
<summary>{{ post.description | xml_escape }}</summary>
|
|
23
|
+
{%- endif %}
|
|
24
|
+
</entry>
|
|
25
|
+
{%- endfor -%}
|
|
26
|
+
{%- endcapture -%}
|
|
27
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
28
|
+
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="{{ sl_f_lang }}">
|
|
29
|
+
<title>{{ site.title | xml_escape }}</title>
|
|
30
|
+
<link href="{{ page.url | absolute_url }}" rel="self" type="application/atom+xml"/>
|
|
31
|
+
<link href="{{ sl_f_prefix | append: '/' | absolute_url }}" rel="alternate" type="text/html"/>
|
|
32
|
+
<id>{{ page.url | absolute_url }}</id>
|
|
33
|
+
<updated>{{ sl_f_updated | date_to_xmlschema }}</updated>
|
|
34
|
+
<author>
|
|
35
|
+
<name>{{ site.author.name | default: site.author | default: site.title | xml_escape }}</name>
|
|
36
|
+
</author>{{ sl_f_entries }}
|
|
37
|
+
</feed>
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
---
|
|
2
|
+
layout: base
|
|
3
|
+
---
|
|
4
|
+
{% include component-css.html name="glossary" %}
|
|
5
|
+
<article class="sl-page">
|
|
6
|
+
<header class="sl-page-header">
|
|
7
|
+
{% include breadcrumbs.html %}
|
|
8
|
+
<h1>{{ page.title }}</h1>{% include copy-page.html %}
|
|
9
|
+
{%- if page.description %}
|
|
10
|
+
<p class="sl-page-lead">{{ page.description }}</p>
|
|
11
|
+
{%- endif %}
|
|
12
|
+
</header>
|
|
13
|
+
{{ content }}
|
|
14
|
+
{%- if site.data.glossary %}
|
|
15
|
+
<dl class="sl-glossary">
|
|
16
|
+
{%- assign sl_terms = site.data.glossary | sort: "term" %}
|
|
17
|
+
{%- for sl_term in sl_terms %}
|
|
18
|
+
<dt id="{{ sl_term.id }}">{{ sl_term.term }}</dt>
|
|
19
|
+
<dd>{{ sl_term.definition }}</dd>
|
|
20
|
+
{%- endfor %}
|
|
21
|
+
</dl>
|
|
22
|
+
{%- endif %}
|
|
23
|
+
</article>
|
data/_layouts/home.html
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
---
|
|
2
|
+
layout: base
|
|
3
|
+
---
|
|
4
|
+
{%- comment -%}
|
|
5
|
+
Four variants, picked by `variant` in the front matter:
|
|
6
|
+
editorial (the default): a large hero, the body, then the latest posts;
|
|
7
|
+
landing: the hero, the body, a grid of `features`, and the call to action again;
|
|
8
|
+
blog: a compact heading, the body, then every post (or `posts_limit` of them);
|
|
9
|
+
docs: the hero, the body, then the docs navigation as cards.
|
|
10
|
+
{%- endcomment -%}
|
|
11
|
+
{%- assign sl_variant = page.variant | default: 'editorial' -%}
|
|
12
|
+
{%- assign sl_lang = page.lang | default: site.lang | default: 'en' -%}
|
|
13
|
+
{%- if sl_variant == 'blog' %}
|
|
14
|
+
<header class="sl-home-head">
|
|
15
|
+
<h1 class="sl-home-title">{{ page.title }}</h1>
|
|
16
|
+
{%- if page.description %}
|
|
17
|
+
<p class="sl-hero-lead">{{ page.description }}</p>
|
|
18
|
+
{%- endif %}
|
|
19
|
+
{%- if page.cta_text and page.cta_url %}
|
|
20
|
+
<p><a class="sl-button" href="{{ page.cta_url | relative_url }}">{{ page.cta_text }}</a></p>
|
|
21
|
+
{%- endif %}
|
|
22
|
+
</header>
|
|
23
|
+
{%- else %}
|
|
24
|
+
<section class="sl-hero sl-hero-{{ sl_variant }}">
|
|
25
|
+
<h1 class="sl-hero-title">{{ page.title }}</h1>
|
|
26
|
+
{%- if page.description %}
|
|
27
|
+
<p class="sl-hero-lead">{{ page.description }}</p>
|
|
28
|
+
{%- endif %}
|
|
29
|
+
{%- if page.cta_text and page.cta_url %}
|
|
30
|
+
<p><a class="sl-button" href="{{ page.cta_url | relative_url }}">{{ page.cta_text }}</a></p>
|
|
31
|
+
{%- endif %}
|
|
32
|
+
</section>
|
|
33
|
+
{%- endif %}
|
|
34
|
+
{{ content }}
|
|
35
|
+
{%- if sl_variant == 'landing' %}
|
|
36
|
+
{%- if page.features.size > 0 %}
|
|
37
|
+
<ul class="sl-features">
|
|
38
|
+
{%- for feature in page.features %}
|
|
39
|
+
<li class="sl-feature">
|
|
40
|
+
<h2 class="sl-feature-title">{% if feature.url %}<a href="{{ feature.url | relative_url }}">{{ feature.title }}</a>{% else %}{{ feature.title }}{% endif %}</h2>
|
|
41
|
+
{%- if feature.text %}
|
|
42
|
+
<p>{{ feature.text }}</p>
|
|
43
|
+
{%- endif %}
|
|
44
|
+
</li>
|
|
45
|
+
{%- endfor %}
|
|
46
|
+
</ul>
|
|
47
|
+
{%- endif %}
|
|
48
|
+
{%- if page.cta_text and page.cta_url %}
|
|
49
|
+
<p class="sl-cta-band"><a class="sl-button" href="{{ page.cta_url | relative_url }}">{{ page.cta_text }}</a></p>
|
|
50
|
+
{%- endif %}
|
|
51
|
+
{%- elsif sl_variant == 'docs' %}
|
|
52
|
+
{%- assign sl_nav_lang = sl_lang | split: '-' | first -%}
|
|
53
|
+
{%- assign sl_nav_key = 'docs_' | append: sl_nav_lang -%}
|
|
54
|
+
{%- assign sl_tree = site.data.navigation[sl_nav_key] | default: site.data.navigation.docs -%}
|
|
55
|
+
{%- if sl_tree.size > 0 %}
|
|
56
|
+
<nav class="sl-doc-index" aria-labelledby="sl-doc-index-title">
|
|
57
|
+
<h2 id="sl-doc-index-title">{% include t.html key='docs_nav' %}</h2>
|
|
58
|
+
<ul class="sl-features">
|
|
59
|
+
{%- for item in sl_tree %}
|
|
60
|
+
<li class="sl-feature">
|
|
61
|
+
{%- if item.children %}
|
|
62
|
+
<h3 class="sl-feature-title">{{ item.title }}</h3>
|
|
63
|
+
<ul>
|
|
64
|
+
{%- for child in item.children %}
|
|
65
|
+
<li><a href="{{ child.url | relative_url }}">{{ child.title }}</a></li>
|
|
66
|
+
{%- endfor %}
|
|
67
|
+
</ul>
|
|
68
|
+
{%- else %}
|
|
69
|
+
<h3 class="sl-feature-title"><a href="{{ item.url | relative_url }}">{{ item.title }}</a></h3>
|
|
70
|
+
{%- endif %}
|
|
71
|
+
</li>
|
|
72
|
+
{%- endfor %}
|
|
73
|
+
</ul>
|
|
74
|
+
</nav>
|
|
75
|
+
{%- endif %}
|
|
76
|
+
{%- else %}
|
|
77
|
+
{%- if sl_variant == 'blog' -%}
|
|
78
|
+
{%- assign sl_limit = page.posts_limit | default: site.posts.size -%}
|
|
79
|
+
{%- else -%}
|
|
80
|
+
{%- assign sl_limit = page.posts_limit | default: 5 -%}
|
|
81
|
+
{%- endif -%}
|
|
82
|
+
{%- assign sl_shown = 0 -%}
|
|
83
|
+
{%- capture sl_items -%}
|
|
84
|
+
{%- for post in site.posts -%}
|
|
85
|
+
{%- if post.lang and post.lang != sl_lang %}{% continue %}{% endif -%}
|
|
86
|
+
{%- if sl_shown >= sl_limit %}{% break %}{% endif -%}
|
|
87
|
+
{%- assign sl_shown = sl_shown | plus: 1 %}
|
|
88
|
+
{% include post-item.html post=post %}
|
|
89
|
+
{%- endfor -%}
|
|
90
|
+
{%- endcapture -%}
|
|
91
|
+
{%- if sl_shown > 0 %}
|
|
92
|
+
<h2>{% if sl_variant == 'blog' %}{% include t.html key='posts' %}{% else %}{% include t.html key='latest_posts' %}{% endif %}</h2>
|
|
93
|
+
<ul class="sl-post-list">{{ sl_items }}
|
|
94
|
+
</ul>
|
|
95
|
+
{%- endif %}
|
|
96
|
+
{%- endif %}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{%- comment -%}
|
|
2
|
+
/llms-full.txt: the text of every page that /llms.txt lists, in the same order, each under its
|
|
3
|
+
title and address. Liquid cannot read a page's Markdown source (ADR 0006), so the text comes from
|
|
4
|
+
the HTML: headings, list items, and code blocks keep Markdown markers; other tags are removed.
|
|
5
|
+
{%- endcomment -%}
|
|
6
|
+
{%- assign sl_lf_all = site.pages | concat: site.documents -%}
|
|
7
|
+
{%- capture sl_lf_nl %}
|
|
8
|
+
{% endcapture -%}
|
|
9
|
+
{%- assign sl_lf_gap = sl_lf_nl | append: sl_lf_nl -%}
|
|
10
|
+
{%- assign sl_lf_wide = sl_lf_gap | append: sl_lf_nl -%}
|
|
11
|
+
{%- assign sl_lf_open = '```' | append: sl_lf_nl | append: '<pre' -%}
|
|
12
|
+
{%- assign sl_lf_close = '</pre>```' | append: sl_lf_gap -%}
|
|
13
|
+
# {{ site.title | default: 'Untitled' }}
|
|
14
|
+
{%- if site.description %}
|
|
15
|
+
|
|
16
|
+
> {{ site.description | strip_newlines }}
|
|
17
|
+
{%- endif %}
|
|
18
|
+
{%- for sl_lf_group in (1..3) -%}
|
|
19
|
+
{%- case sl_lf_group -%}{%- when 1 -%}{%- assign sl_lf_name = 'Docs' -%}{%- when 2 -%}{%- assign sl_lf_name = 'Posts' -%}{%- else -%}{%- assign sl_lf_name = 'Pages' -%}{%- endcase -%}
|
|
20
|
+
{%- for item in sl_lf_all -%}
|
|
21
|
+
{%- include llms-item.html item=item -%}
|
|
22
|
+
{%- if sl_li_group != sl_lf_name -%}{%- continue -%}{%- endif -%}
|
|
23
|
+
{%- assign sl_lf_text = item.content | markdownify
|
|
24
|
+
| replace: '<h1', '# <h1' | replace: '<h2', '## <h2' | replace: '<h3', '### <h3'
|
|
25
|
+
| replace: '<h4', '#### <h4' | replace: '<h5', '##### <h5' | replace: '<h6', '###### <h6'
|
|
26
|
+
| replace: '<li', '- <li' | replace: '<br', sl_lf_nl
|
|
27
|
+
| replace: '<pre', sl_lf_open | replace: '</pre>', sl_lf_close
|
|
28
|
+
| replace: '</p>', sl_lf_gap | replace: '</h1>', sl_lf_gap | replace: '</h2>', sl_lf_gap
|
|
29
|
+
| replace: '</h3>', sl_lf_gap | replace: '</h4>', sl_lf_gap | replace: '</h5>', sl_lf_gap
|
|
30
|
+
| replace: '</h6>', sl_lf_gap | replace: '</ul>', sl_lf_gap | replace: '</ol>', sl_lf_gap
|
|
31
|
+
| replace: '</blockquote>', sl_lf_gap | replace: '</table>', sl_lf_gap | replace: '</div>', sl_lf_nl
|
|
32
|
+
| strip_html
|
|
33
|
+
| replace: '<', '<' | replace: '>', '>' | replace: '"', '"' | replace: ''', "'"
|
|
34
|
+
| replace: '“', '“' | replace: '”', '”' | replace: '‘', '‘' | replace: '’', '’'
|
|
35
|
+
| replace: '…', '…' | replace: '–', '–' | replace: '—', '—' | replace: ' ', ' '
|
|
36
|
+
| replace: '«', '«' | replace: '»', '»' | replace: '&', '&' -%}
|
|
37
|
+
{%- for i in (1..4) -%}{%- assign sl_lf_text = sl_lf_text | replace: sl_lf_wide, sl_lf_gap -%}{%- endfor -%}
|
|
38
|
+
{%- assign sl_lf_text = sl_lf_text | strip %}
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
# {{ item.title | default: item.url | strip_newlines }}
|
|
43
|
+
|
|
44
|
+
Source: {{ item.url | absolute_url }}
|
|
45
|
+
{%- if item.description %}
|
|
46
|
+
|
|
47
|
+
{{ item.description | strip_newlines }}
|
|
48
|
+
{%- endif %}
|
|
49
|
+
{%- if sl_lf_text != '' %}
|
|
50
|
+
|
|
51
|
+
{{ sl_lf_text }}
|
|
52
|
+
{%- endif -%}
|
|
53
|
+
{%- endfor -%}
|
|
54
|
+
{%- endfor %}
|
data/_layouts/llms.html
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{%- comment -%}
|
|
2
|
+
/llms.txt (https://llmstxt.org): the site title, its description, and one link per page with its
|
|
3
|
+
description, in sections Docs, Posts and Pages. Pages are chosen by llms-item.html.
|
|
4
|
+
{%- endcomment -%}
|
|
5
|
+
{%- assign sl_ll_all = site.pages | concat: site.documents -%}
|
|
6
|
+
{%- assign sl_ll_full = nil -%}
|
|
7
|
+
{%- for p in site.pages -%}{%- if p.layout == 'llms-full' -%}{%- assign sl_ll_full = p -%}{%- break -%}{%- endif -%}{%- endfor -%}
|
|
8
|
+
# {{ site.title | default: 'Untitled' }}
|
|
9
|
+
{%- if site.description %}
|
|
10
|
+
|
|
11
|
+
> {{ site.description | strip_newlines }}
|
|
12
|
+
{%- endif %}
|
|
13
|
+
{%- if sl_ll_full %}
|
|
14
|
+
|
|
15
|
+
The full text of every page is in [{{ sl_ll_full.url | remove_first: '/' }}]({{ sl_ll_full.url | absolute_url }}).
|
|
16
|
+
{%- endif %}
|
|
17
|
+
{%- for sl_ll_group in (1..3) -%}
|
|
18
|
+
{%- case sl_ll_group -%}{%- when 1 -%}{%- assign sl_ll_name = 'Docs' -%}{%- when 2 -%}{%- assign sl_ll_name = 'Posts' -%}{%- else -%}{%- assign sl_ll_name = 'Pages' -%}{%- endcase -%}
|
|
19
|
+
{%- capture sl_ll_lines -%}
|
|
20
|
+
{%- for item in sl_ll_all -%}
|
|
21
|
+
{%- include llms-item.html item=item -%}
|
|
22
|
+
{%- if sl_li_group != sl_ll_name -%}{%- continue -%}{%- endif %}
|
|
23
|
+
- [{{ item.title | default: item.url | strip_newlines }}]({{ item.url | absolute_url }})
|
|
24
|
+
{%- if item.description -%}: {{ item.description | strip_newlines }}{%- endif -%}
|
|
25
|
+
{%- endfor -%}
|
|
26
|
+
{%- endcapture -%}
|
|
27
|
+
{%- if sl_ll_lines != '' %}
|
|
28
|
+
|
|
29
|
+
## {{ sl_ll_name }}
|
|
30
|
+
{{ sl_ll_lines }}
|
|
31
|
+
{%- endif -%}
|
|
32
|
+
{%- endfor %}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
---
|
|
2
|
+
layout: base
|
|
3
|
+
---
|
|
4
|
+
{%- comment -%}
|
|
5
|
+
GitHub Pages serves one 404.html for the whole site and cannot tell which language the visitor wanted, so this
|
|
6
|
+
page has a section for every language in slipway.languages (or just the page language) under one heading.
|
|
7
|
+
{%- endcomment -%}
|
|
8
|
+
{%- assign sl_nf_langs = site.slipway.languages -%}
|
|
9
|
+
<article class="sl-not-found">
|
|
10
|
+
<h1 class="sl-not-found-code">404</h1>
|
|
11
|
+
{%- if sl_nf_langs.size > 0 %}
|
|
12
|
+
{%- for l in sl_nf_langs %}
|
|
13
|
+
{%- capture sl_nf_dir %}{% include dir.html lang=l.code %}{% endcapture %}
|
|
14
|
+
<section lang="{{ l.code }}" dir="{{ sl_nf_dir }}">
|
|
15
|
+
<h2>{% include t.html lang=l.code key='not_found_title' %}</h2>
|
|
16
|
+
<p>{% include t.html lang=l.code key='not_found_text' %}</p>
|
|
17
|
+
<p><a class="sl-button" href="{{ l.prefix | append: '/' | relative_url }}">{% include t.html lang=l.code key='go_home' %}</a></p>
|
|
18
|
+
</section>
|
|
19
|
+
{%- endfor %}
|
|
20
|
+
{%- else %}
|
|
21
|
+
<section>
|
|
22
|
+
<h2>{% include t.html key='not_found_title' %}</h2>
|
|
23
|
+
<p>{% include t.html key='not_found_text' %}</p>
|
|
24
|
+
<p><a class="sl-button" href="{{ '/' | relative_url }}">{% include t.html key='go_home' %}</a></p>
|
|
25
|
+
</section>
|
|
26
|
+
{%- endif %}
|
|
27
|
+
</article>
|
data/_layouts/page.html
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
---
|
|
2
|
+
layout: base
|
|
3
|
+
---
|
|
4
|
+
<article class="sl-page">
|
|
5
|
+
<header class="sl-page-header">
|
|
6
|
+
{% include breadcrumbs.html %}
|
|
7
|
+
<h1>{{ page.title }}</h1>{% include copy-page.html %}
|
|
8
|
+
{%- if page.description %}
|
|
9
|
+
<p class="sl-page-lead">{{ page.description }}</p>
|
|
10
|
+
{%- endif %}
|
|
11
|
+
</header>
|
|
12
|
+
{{ content }}
|
|
13
|
+
</article>
|