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.
Files changed (96) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -0
  3. data/_includes/analytics.html +12 -0
  4. data/_includes/author-card.html +29 -0
  5. data/_includes/author-ids.html +2 -0
  6. data/_includes/author-url.html +11 -0
  7. data/_includes/breadcrumbs.html +67 -0
  8. data/_includes/byline.html +14 -0
  9. data/_includes/compat.html +11 -0
  10. data/_includes/component-css.html +5 -0
  11. data/_includes/copy-page.html +5 -0
  12. data/_includes/date.html +90 -0
  13. data/_includes/dir.html +4 -0
  14. data/_includes/edit-sources.html +25 -0
  15. data/_includes/feedback.html +12 -0
  16. data/_includes/footer-custom.html +5 -0
  17. data/_includes/footer.html +16 -0
  18. data/_includes/head-custom.html +5 -0
  19. data/_includes/head.html +52 -0
  20. data/_includes/header.html +38 -0
  21. data/_includes/i18n/ar.html +43 -0
  22. data/_includes/i18n/de.html +43 -0
  23. data/_includes/i18n/en.html +43 -0
  24. data/_includes/i18n/es.html +43 -0
  25. data/_includes/i18n/fa.html +43 -0
  26. data/_includes/i18n/fr.html +43 -0
  27. data/_includes/i18n/he.html +42 -0
  28. data/_includes/i18n/it.html +43 -0
  29. data/_includes/i18n/ja.html +43 -0
  30. data/_includes/i18n/nl.html +43 -0
  31. data/_includes/i18n/pt.html +43 -0
  32. data/_includes/i18n/ru.html +43 -0
  33. data/_includes/i18n/tr.html +43 -0
  34. data/_includes/i18n/zh.html +43 -0
  35. data/_includes/i18n-builtin.html +8 -0
  36. data/_includes/icons/github.svg +1 -0
  37. data/_includes/icons/linkedin.svg +1 -0
  38. data/_includes/icons/mastodon.svg +1 -0
  39. data/_includes/icons/twitter.svg +1 -0
  40. data/_includes/icons/x.svg +1 -0
  41. data/_includes/icons/youtube.svg +1 -0
  42. data/_includes/jsonld.html +41 -0
  43. data/_includes/lang-switcher.html +15 -0
  44. data/_includes/layout-url.html +8 -0
  45. data/_includes/llms-item.html +19 -0
  46. data/_includes/num.html +3 -0
  47. data/_includes/post-item.html +4 -0
  48. data/_includes/related-posts.html +37 -0
  49. data/_includes/search.html +13 -0
  50. data/_includes/seo.html +42 -0
  51. data/_includes/series.html +47 -0
  52. data/_includes/skip-link.html +1 -0
  53. data/_includes/t.html +4 -0
  54. data/_includes/taxonomy.html +22 -0
  55. data/_includes/term.html +7 -0
  56. data/_includes/theme-init.html +1 -0
  57. data/_includes/theme-var.html +4 -0
  58. data/_includes/theme-vars.html +17 -0
  59. data/_layouts/archive.html +32 -0
  60. data/_layouts/author.html +31 -0
  61. data/_layouts/base.html +19 -0
  62. data/_layouts/default.html +4 -0
  63. data/_layouts/doc.html +89 -0
  64. data/_layouts/feed.html +37 -0
  65. data/_layouts/glossary.html +23 -0
  66. data/_layouts/home.html +96 -0
  67. data/_layouts/llms-full.html +54 -0
  68. data/_layouts/llms.html +32 -0
  69. data/_layouts/not-found.html +27 -0
  70. data/_layouts/page.html +13 -0
  71. data/_layouts/post.html +72 -0
  72. data/_layouts/search-index.html +12 -0
  73. data/_layouts/sitemap.html +24 -0
  74. data/_layouts/sourcemap.html +28 -0
  75. data/_layouts/tags.html +24 -0
  76. data/_layouts/translation-status.html +44 -0
  77. data/assets/css/components/glossary.css +21 -0
  78. data/assets/css/fonts.css +47 -0
  79. data/assets/css/nav.css +104 -0
  80. data/assets/css/print.css +70 -0
  81. data/assets/css/slipway.css +952 -0
  82. data/assets/css/tokens.css +57 -0
  83. data/assets/fonts/LICENSES/InstrumentSerif-OFL.txt +93 -0
  84. data/assets/fonts/LICENSES/SourceSerif4-OFL.txt +93 -0
  85. data/assets/fonts/LICENSES/Vazirmatn-OFL.txt +93 -0
  86. data/assets/fonts/instrument-serif-latin-400-italic.woff2 +0 -0
  87. data/assets/fonts/instrument-serif-latin-400-normal.woff2 +0 -0
  88. data/assets/fonts/source-serif-4-latin-wght-italic.woff2 +0 -0
  89. data/assets/fonts/source-serif-4-latin-wght-normal.woff2 +0 -0
  90. data/assets/fonts/vazirmatn-arabic-wght-normal.woff2 +0 -0
  91. data/assets/images/social.png +0 -0
  92. data/assets/js/copy-code.js +53 -0
  93. data/assets/js/edit-prompt.js +23 -0
  94. data/assets/js/search.js +114 -0
  95. data/assets/js/theme-toggle.js +66 -0
  96. metadata +156 -0
@@ -0,0 +1,72 @@
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_words = content | number_of_words -%}
7
+ {%- assign sl_minutes = sl_words | divided_by: 200.0 | ceil -%}
8
+ {%- if sl_minutes < 1 %}{% assign sl_minutes = 1 %}{% endif -%}
9
+ <article class="sl-post" data-edit-label="{{ sl_edit_label | escape }}" data-edit-prompt="{{ sl_edit_prompt | escape }}">
10
+ <header class="sl-post-header">
11
+ <h1>{{ page.title }}</h1>{% include copy-page.html %}
12
+ <p class="sl-post-meta">
13
+ <time datetime="{{ page.date | date_to_xmlschema }}">{% include date.html date=page.date %}</time>
14
+ <span>{% include num.html value=sl_minutes %} {% include t.html key='min_read' %}</span>
15
+ {%- capture sl_byline %}{% include byline.html page=page %}{% endcapture %}
16
+ {%- assign sl_byline = sl_byline | strip %}
17
+ {%- if sl_byline != '' %}
18
+ {{ sl_byline }}
19
+ {%- endif %}
20
+ {%- capture sl_tags_url %}{% include layout-url.html layout='tags' %}{% endcapture %}
21
+ {%- assign sl_tags_url = sl_tags_url | strip %}
22
+ {%- if page.tags and page.tags.size > 0 %}
23
+ <span class="sl-post-tags">
24
+ {%- for tag in page.tags %}
25
+ {%- if sl_tags_url != '' %}<a class="sl-tag" href="{{ sl_tags_url }}#tag-{{ tag | slugify }}">{{ tag }}</a>{% else %}<span class="sl-tag">{{ tag }}</span>{% endif %}
26
+ {%- endfor -%}
27
+ </span>
28
+ {%- endif %}
29
+ {%- if page.categories and page.categories.size > 0 %}
30
+ <span class="sl-post-tags">
31
+ {%- for category in page.categories %}
32
+ {%- if sl_tags_url != '' %}<a class="sl-tag" href="{{ sl_tags_url }}#category-{{ category | slugify }}">{{ category }}</a>{% else %}<span class="sl-tag">{{ category }}</span>{% endif %}
33
+ {%- endfor -%}
34
+ </span>
35
+ {%- endif %}
36
+ </p>
37
+ </header>
38
+ {%- include series.html %}
39
+ {% include edit-sources.html html=content %}
40
+ {%- include author-ids.html page=page -%}
41
+ {%- capture sl_author_cards %}{% for id in sl_ai_ids %}{% include author-card.html id=id link=true %}{% endfor %}{% endcapture %}
42
+ {%- assign sl_author_cards_clean = sl_author_cards | strip %}
43
+ {%- if sl_author_cards_clean != '' %}
44
+ <aside class="sl-authors" aria-label="{% include t.html key='about_author' %}">
45
+ {{ sl_author_cards_clean }}
46
+ </aside>
47
+ {%- endif %}
48
+ {%- include related-posts.html page=page %}
49
+ {%- comment -%} Neighbours in the same language: site.posts is newest first, so the post seen before this one is newer. {%- endcomment %}
50
+ {%- assign sl_lang = page.lang | default: site.lang | default: 'en' -%}
51
+ {%- assign sl_newer = nil -%}
52
+ {%- assign sl_older = nil -%}
53
+ {%- assign sl_last = nil -%}
54
+ {%- assign sl_found = false -%}
55
+ {%- for post in site.posts -%}
56
+ {%- assign sl_post_lang = post.lang | default: site.lang | default: 'en' -%}
57
+ {%- if sl_post_lang != sl_lang %}{% continue %}{% endif -%}
58
+ {%- if sl_found -%}{%- assign sl_older = post -%}{%- break -%}{%- endif -%}
59
+ {%- if post.url == page.url -%}{%- assign sl_found = true -%}{%- assign sl_newer = sl_last -%}{%- endif -%}
60
+ {%- assign sl_last = post -%}
61
+ {%- endfor -%}
62
+ {%- if sl_newer or sl_older %}
63
+ <nav class="sl-pager" aria-label="{% include t.html key='post_pager' %}">
64
+ {%- if sl_older %}
65
+ <a class="sl-pager-prev" rel="prev" href="{{ sl_older.url | relative_url }}"><span>{% include t.html key='previous' %}</span> {{ sl_older.title }}</a>
66
+ {%- endif %}
67
+ {%- if sl_newer %}
68
+ <a class="sl-pager-next" rel="next" href="{{ sl_newer.url | relative_url }}"><span>{% include t.html key='next' %}</span> {{ sl_newer.title }}</a>
69
+ {%- endif %}
70
+ </nav>
71
+ {%- endif %}
72
+ </article>
@@ -0,0 +1,12 @@
1
+ {%- assign sl_ix_lang = page.lang | default: site.lang | default: 'en' -%}
2
+ {%- assign sl_ix_all = site.pages | concat: site.documents -%}
3
+ {%- assign sl_ix_n = 0 -%}
4
+ [
5
+ {%- for item in sl_ix_all -%}
6
+ {%- assign sl_ix_item_lang = item.lang | default: site.lang | default: 'en' -%}
7
+ {%- if sl_ix_item_lang != sl_ix_lang or item.search == false or item.layout == 'search-index' or item.title == nil -%}{%- continue -%}{%- endif -%}
8
+ {%- if sl_ix_n > 0 -%},{%- endif -%}
9
+ {%- assign sl_ix_n = sl_ix_n | plus: 1 %}
10
+ {"title":{{ item.title | jsonify }},"url":{{ item.url | relative_url | jsonify }},"description":{{ item.description | default: '' | jsonify }},"text":{{ item.content | markdownify | strip_html | normalize_whitespace | truncate: 600 | jsonify }}}
11
+ {%- endfor %}
12
+ ]
@@ -0,0 +1,24 @@
1
+ {%- assign sl_m_all = site.pages | concat: site.documents -%}
2
+ <?xml version="1.0" encoding="UTF-8"?>
3
+ <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml">
4
+ {%- for item in sl_m_all -%}
5
+ {%- if item.sitemap == false or item.layout == 'feed' or item.layout == 'sitemap' or item.layout == 'search-index' or item.url == '/404.html' -%}{%- continue -%}{%- endif -%}
6
+ {%- assign sl_m_last = item.url | slice: -1 -%}
7
+ {%- assign sl_m_ext = item.url | split: '.' | last -%}
8
+ {%- if sl_m_last != '/' and sl_m_ext != 'html' -%}{%- continue -%}{%- endif %}
9
+ <url>
10
+ <loc>{{ item.url | absolute_url | xml_escape }}</loc>
11
+ {%- assign sl_m_mod = item.last_modified_at | default: item.date -%}
12
+ {%- if sl_m_mod %}
13
+ <lastmod>{{ sl_m_mod | date_to_xmlschema }}</lastmod>
14
+ {%- endif %}
15
+ {%- if item.translation_key %}
16
+ {%- for other in sl_m_all %}
17
+ {%- if other.translation_key == item.translation_key %}
18
+ <xhtml:link rel="alternate" hreflang="{{ other.lang | default: site.lang | default: 'en' }}" href="{{ other.url | absolute_url | xml_escape }}"/>
19
+ {%- endif %}
20
+ {%- endfor %}
21
+ {%- endif %}
22
+ </url>
23
+ {%- endfor %}
24
+ </urlset>
@@ -0,0 +1,28 @@
1
+ {%- comment -%}
2
+ /sourcemap.json, level 0 (ADR 0007, spec/sourcemap/v0.md): each content page's url and its source file.
3
+ Generated files are left out: anything under assets/, the feed, sitemap, search index and this map,
4
+ Markdown twin stubs, and every url that is not a page (ends in neither / nor .html).
5
+ Lines are not computed here; ADR 0007 rejects a Liquid line map.
6
+ {%- endcomment -%}
7
+ {%- assign sl_sm_all = site.pages | concat: site.documents -%}
8
+ {%- assign sl_sm_n = 0 -%}
9
+ {"version":0,"pages":[
10
+ {%- for item in sl_sm_all -%}
11
+ {%- if item.path == nil or item.url == nil -%}{%- continue -%}{%- endif -%}
12
+ {%- if item.layout == 'feed' or item.layout == 'sitemap' or item.layout == 'search-index' or item.layout == 'sourcemap' -%}{%- continue -%}{%- endif -%}
13
+ {%- assign sl_sm_head = item.path | slice: 0, 7 -%}
14
+ {%- if sl_sm_head == 'assets/' -%}{%- continue -%}{%- endif -%}
15
+ {%- assign sl_sm_ext = item.path | split: '.' | last | downcase -%}
16
+ {%- if sl_sm_ext == 'xml' or sl_sm_ext == 'json' or sl_sm_ext == 'css' or sl_sm_ext == 'scss' or sl_sm_ext == 'js' or sl_sm_ext == 'txt' -%}{%- continue -%}{%- endif -%}
17
+ {%- assign sl_sm_last = item.url | slice: -1 -%}
18
+ {%- assign sl_sm_uext = item.url | split: '.' | last -%}
19
+ {%- if sl_sm_last != '/' and sl_sm_uext != 'html' -%}{%- continue -%}{%- endif -%}
20
+ {%- if item.collection -%}
21
+ {%- assign sl_sm_coll = site.collections | where: 'label', item.collection | first -%}
22
+ {%- if sl_sm_coll.output == false -%}{%- continue -%}{%- endif -%}
23
+ {%- endif -%}
24
+ {%- if sl_sm_n > 0 -%},{%- endif -%}
25
+ {%- assign sl_sm_n = sl_sm_n | plus: 1 %}
26
+ {"url":{{ item.url | jsonify }},"source":{{ item.path | jsonify }}}
27
+ {%- endfor %}
28
+ ]}
@@ -0,0 +1,24 @@
1
+ ---
2
+ layout: base
3
+ ---
4
+ <article class="sl-page">
5
+ <header class="sl-page-header">
6
+ <h1>{{ page.title }}</h1>
7
+ {%- if page.description %}
8
+ <p class="sl-page-lead">{{ page.description }}</p>
9
+ {%- endif %}
10
+ </header>
11
+ {{ content }}
12
+ {%- capture sl_tag_sections %}{% include taxonomy.html terms=site.tags kind="tag" %}{% endcapture %}
13
+ {%- assign sl_tag_sections_clean = sl_tag_sections | strip %}
14
+ {%- if sl_tag_sections_clean != '' %}
15
+ <h2 id="tags">{% include t.html key='tags' %}</h2>
16
+ {{ sl_tag_sections }}
17
+ {%- endif %}
18
+ {%- capture sl_cat_sections %}{% include taxonomy.html terms=site.categories kind="category" %}{% endcapture %}
19
+ {%- assign sl_cat_sections_clean = sl_cat_sections | strip %}
20
+ {%- if sl_cat_sections_clean != '' %}
21
+ <h2 id="categories">{% include t.html key='categories' %}</h2>
22
+ {{ sl_cat_sections }}
23
+ {%- endif %}
24
+ </article>
@@ -0,0 +1,44 @@
1
+ ---
2
+ layout: base
3
+ ---
4
+ <article class="sl-page">
5
+ <header class="sl-page-header">
6
+ <h1>{{ page.title }}</h1>
7
+ {%- if page.description %}
8
+ <p class="sl-page-lead">{{ page.description }}</p>
9
+ {%- endif %}
10
+ </header>
11
+ {{ content }}
12
+
13
+ {%- assign sl_all = site.pages | concat: site.documents | where_exp: "item", "item.translation_key != nil" -%}
14
+ {%- assign sl_keys_raw = sl_all | map: "translation_key" | uniq | sort -%}
15
+ {%- assign sl_langs = site.slipway.languages -%}
16
+
17
+ <div class="sl-table-wrapper">
18
+ <table>
19
+ <thead>
20
+ <tr>
21
+ <th>{% include t.html key='translation_key' %}|{% include t.html key='translation_key' %}</th>
22
+ {%- for l in sl_langs %}
23
+ <th>{{ l.name }}</th>
24
+ {%- endfor %}
25
+ </tr>
26
+ </thead>
27
+ <tbody>
28
+ {%- for k in sl_keys_raw %}
29
+ <tr>
30
+ <td><code>{{ k }}</code></td>
31
+ {%- for l in sl_langs %}
32
+ {%- assign sl_match = sl_all | where: "translation_key", k | where: "lang", l.code | first -%}
33
+ {%- if sl_match %}
34
+ <td><a href="{{ sl_match.url | relative_url }}">{{ sl_match.title }}</a></td>
35
+ {%- else %}
36
+ <td></td>
37
+ {%- endif %}
38
+ {%- endfor %}
39
+ </tr>
40
+ {%- endfor %}
41
+ </tbody>
42
+ </table>
43
+ </div>
44
+ </article>
@@ -0,0 +1,21 @@
1
+ /* Glossary components */
2
+ .sl-glossary dt {
3
+ font-weight: bold;
4
+ margin-block-start: var(--sl-step-base);
5
+ }
6
+
7
+ .sl-glossary dd {
8
+ margin-block-start: calc(var(--sl-step-base) / 4);
9
+ margin-inline-start: var(--sl-step-base);
10
+ }
11
+
12
+ .sl-term {
13
+ text-decoration-style: dotted;
14
+ text-decoration-thickness: 1px;
15
+ text-underline-offset: 3px;
16
+ cursor: help;
17
+ }
18
+
19
+ .sl-term:hover {
20
+ text-decoration-style: solid;
21
+ }
@@ -0,0 +1,47 @@
1
+ /* Self-hosted fonts (ADR 0004), all SIL OFL 1.1; licenses are in assets/fonts/LICENSES/.
2
+ Faces are split by unicode-range, so a page without Persian text never downloads Vazirmatn. */
3
+ @font-face {
4
+ font-family: "Instrument Serif";
5
+ font-style: normal;
6
+ font-weight: 400;
7
+ font-display: swap;
8
+ src: url("../fonts/instrument-serif-latin-400-normal.woff2") format("woff2");
9
+ unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
10
+ }
11
+
12
+ @font-face {
13
+ font-family: "Instrument Serif";
14
+ font-style: italic;
15
+ font-weight: 400;
16
+ font-display: swap;
17
+ src: url("../fonts/instrument-serif-latin-400-italic.woff2") format("woff2");
18
+ unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
19
+ }
20
+
21
+ @font-face {
22
+ font-family: "Source Serif 4";
23
+ font-style: normal;
24
+ font-weight: 200 900;
25
+ font-display: swap;
26
+ src: url("../fonts/source-serif-4-latin-wght-normal.woff2") format("woff2");
27
+ unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
28
+ }
29
+
30
+ @font-face {
31
+ font-family: "Source Serif 4";
32
+ font-style: italic;
33
+ font-weight: 200 900;
34
+ font-display: swap;
35
+ src: url("../fonts/source-serif-4-latin-wght-italic.woff2") format("woff2");
36
+ unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
37
+ }
38
+
39
+ /* Arabic script only: Latin letters on a Persian page come from Source Serif 4. */
40
+ @font-face {
41
+ font-family: "Vazirmatn";
42
+ font-style: normal;
43
+ font-weight: 100 900;
44
+ font-display: swap;
45
+ src: url("../fonts/vazirmatn-arabic-wght-normal.woff2") format("woff2");
46
+ unicode-range: U+0600-06FF,U+0750-077F,U+0870-088E,U+0890-0891,U+0897-08E1,U+08E3-08FF,U+200C-200E,U+2010-2011,U+204F,U+2E41,U+FB50-FDFF,U+FE70-FE74,U+FE76-FEFC;
47
+ }
@@ -0,0 +1,104 @@
1
+ /* Mobile navigation drawer. Included after slipway.css. */
2
+ @layer components {
3
+ /* Hide the toggle and state on desktop. */
4
+ .sl-nav-state,
5
+ .sl-nav-toggle,
6
+ .sl-nav-backdrop {
7
+ display: none;
8
+ }
9
+
10
+ /* Desktop: The drawer behaves as if it wasn't there so flexbox layout of sl-header works. */
11
+ .sl-nav-drawer {
12
+ display: contents;
13
+ }
14
+
15
+ /* Mobile */
16
+ @media (max-width: 63.99rem) {
17
+ .sl-header {
18
+ flex-wrap: wrap;
19
+ }
20
+
21
+ /* The checkbox holds the open/closed state. */
22
+ .sl-nav-state {
23
+ display: none;
24
+ }
25
+
26
+ /* The hamburger button. */
27
+ .sl-nav-toggle {
28
+ display: flex;
29
+ align-items: center;
30
+ justify-content: center;
31
+ cursor: pointer;
32
+ color: var(--sl-color-heading);
33
+ padding: var(--sl-space-2);
34
+ border-radius: var(--sl-radius-compact);
35
+ margin-inline-start: auto;
36
+ transition: background-color var(--sl-motion-fast);
37
+ }
38
+
39
+ .sl-nav-toggle:hover {
40
+ background-color: var(--sl-color-surface);
41
+ }
42
+
43
+ .sl-nav-toggle svg {
44
+ inline-size: 1.5rem;
45
+ block-size: 1.5rem;
46
+ fill: currentColor;
47
+ }
48
+
49
+ /* The drawer that slides in. */
50
+ .sl-nav-drawer {
51
+ display: block;
52
+ position: fixed;
53
+ inset-block: 0;
54
+ inset-inline-start: -100%; /* Hidden off-screen logically */
55
+ inline-size: 80%;
56
+ max-inline-size: 20rem;
57
+ background: var(--sl-color-canvas);
58
+ z-index: 100;
59
+ padding: var(--sl-space-6) var(--sl-space-4);
60
+ box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);
61
+ transition: inset-inline-start var(--sl-motion-normal) ease-in-out;
62
+ overflow-y: auto;
63
+ }
64
+
65
+ /* The dark overlay behind the drawer. */
66
+ .sl-nav-backdrop {
67
+ display: block;
68
+ position: fixed;
69
+ inset: 0;
70
+ background: rgba(0, 0, 0, 0.5);
71
+ z-index: 90;
72
+ opacity: 0;
73
+ pointer-events: none;
74
+ transition: opacity var(--sl-motion-normal) ease-in-out;
75
+ }
76
+
77
+ /* When the checkbox is checked, slide the drawer in and show the backdrop. */
78
+ .sl-nav-state:checked ~ .sl-nav-backdrop {
79
+ opacity: 1;
80
+ pointer-events: auto;
81
+ cursor: pointer;
82
+ }
83
+
84
+ .sl-nav-state:checked ~ .sl-nav-drawer {
85
+ inset-inline-start: 0;
86
+ }
87
+
88
+ /* Force mobile nav items to stack vertically. */
89
+ .sl-nav-drawer .sl-main-nav {
90
+ margin-block-start: var(--sl-space-4);
91
+ }
92
+
93
+ .sl-nav-drawer .sl-main-nav ul {
94
+ flex-direction: column;
95
+ gap: var(--sl-space-4);
96
+ }
97
+
98
+ .sl-nav-drawer .sl-main-nav a {
99
+ font-size: var(--sl-step-lg);
100
+ display: block;
101
+ padding-block: var(--sl-space-2);
102
+ }
103
+ }
104
+ }
@@ -0,0 +1,70 @@
1
+ /* Print: the light palette, no chrome, and the address after each external link. Logical properties only. */
2
+ @page {
3
+ margin: 2cm;
4
+ }
5
+
6
+ :root,
7
+ :root[data-theme] {
8
+ color-scheme: light;
9
+ }
10
+
11
+ html {
12
+ background: none;
13
+ }
14
+
15
+ body {
16
+ font-size: 11pt;
17
+ line-height: 1.5;
18
+ }
19
+
20
+ .sl-header,
21
+ .sl-theme-toggle,
22
+ nav {
23
+ display: none;
24
+ }
25
+
26
+ main {
27
+ max-inline-size: none;
28
+ padding-inline: 0;
29
+ }
30
+
31
+ .sl-wide,
32
+ .sl-bleed {
33
+ inline-size: auto;
34
+ margin-inline: 0;
35
+ }
36
+
37
+ h1,
38
+ h2,
39
+ h3 {
40
+ break-after: avoid;
41
+ }
42
+
43
+ pre,
44
+ img,
45
+ blockquote {
46
+ break-inside: avoid;
47
+ }
48
+
49
+ pre {
50
+ white-space: pre-wrap;
51
+ }
52
+
53
+ a {
54
+ color: inherit;
55
+ }
56
+
57
+ a[href^="http"]::after {
58
+ content: " (" attr(href) ")";
59
+ font-size: 0.85em;
60
+ color: var(--sl-color-muted);
61
+ overflow-wrap: anywhere;
62
+ }
63
+
64
+ .sl-copy {
65
+ display: none;
66
+ }
67
+
68
+ .sl-edit {
69
+ display: none;
70
+ }