just-the-docs 0.9.0 → 0.10.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: ce292fe4d8d3ed40611eb39229671ef8e38e86134e288d54c7e9f93412c4eedc
4
- data.tar.gz: fc63da23207b3c16826bd634257efa1becc71abb2a2a3004a92f9136a52b04ad
3
+ metadata.gz: 555f04daa56535911096cb34c790bb8c8b89a617f398cbf93378954387ac1f1e
4
+ data.tar.gz: 873150f2912a9a83d170f2ceb98d725f507a39e49ebb990885887c4c980c4378
5
5
  SHA512:
6
- metadata.gz: 811ca2371d262ed21c7009f7fcb86811274bdb8d42e64960fe32be6adab4a63a734d3561a8b3011b24d3601c91516cbb70fd1533200d125cc1771a380fba0ca8
7
- data.tar.gz: 33ee2161b4b212f16e42e2d1c858004a8c06860a69efe7d5ff673a8217bd44b5d657465bbe7336593f45adb040991ddb0a369aaba6104e10d00d80560e79e249
6
+ metadata.gz: 5385791a026feeb7b51730f7bcd5bfc63afa4ca886467eea5bc443ce6de90cee66e4fa6b47747f8014830abfdaf21c138a65deae0f673205ebc0bc3c0a928375
7
+ data.tar.gz: 9285866faa3b41d50cd048a7ef587efc4f15fe7c8003c0e8d3387aa3538cf74692f501b780515df44011dd62fe7e91c46f1ec033dc7b1a0705a2c77b443849eb
data/CHANGELOG.md CHANGED
@@ -23,6 +23,45 @@ Docs changes made since the latest release:
23
23
 
24
24
  - N/A
25
25
 
26
+ ## Release v0.10.0
27
+
28
+ Hi folks! This minor release adds one of our most-requested features: unlimited multi-level navigation (also known as recursive navigation). Huge thanks to [@pdmosses] for his wonderful work in implementing this feature!
29
+
30
+ This release should be a straightforward upgrade for all users of Just the Docs. Thank you for your continued support!
31
+
32
+ ### Using Release `v0.10.0`
33
+
34
+ Users who have not pinned the theme version will be **automatically upgraded to `v0.9.0` the next time they build their site**.
35
+
36
+ To use this release explicitly as a remote theme:
37
+
38
+ ```yml
39
+ remote_theme: just-the-docs/just-the-docs@v0.10.0
40
+ ```
41
+
42
+ To use this version explicitly as a gem-based theme, pin the version in your `Gemfile` and re-run `bundle install` or `bundle update just-the-docs`:
43
+
44
+ ```ruby
45
+ gem "just-the-docs", "0.10.0"
46
+ ```
47
+
48
+ To use and pin a previous version of the theme, replace the `0.10.0` with the desired release tag.
49
+
50
+ ### New Features
51
+
52
+ - Added: Allow unlimited multi-level navigation by [@pdmosses] in [#1431]
53
+
54
+ ### Documentation
55
+
56
+ - Added: Allow unlimited multi-level navigation by [@pdmosses] in [#1440]
57
+ - Added: sitemap (via `jekyll-sitemap` plugin) by [@mattxwang] in [#1530]
58
+ - Fixed: (non-systemic) accessibility issues flagged by aXe by [@mattxwang] in [#1531]
59
+
60
+ [#1431]: https://github.com/just-the-docs/just-the-docs/pull/1431
61
+ [#1440]: https://github.com/just-the-docs/just-the-docs/pull/1440
62
+ [#1530]: https://github.com/just-the-docs/just-the-docs/pull/1530
63
+ [#1530]: https://github.com/just-the-docs/just-the-docs/pull/1531
64
+
26
65
  ## Release v0.9.0
27
66
 
28
67
  Hi folks! This minor release adds a `nav_enabled` set of variables to enable/disable the navigation at a site, layout, and page level --- and uses that to add search and auxilary links to the `minimal` layout. In addition, it fixes `search-data.json` corruption with default layouts and some minor CSS/SCSS issues.
@@ -31,7 +70,7 @@ This release should be a straightforward upgrade for all users of Just the Docs.
31
70
 
32
71
  ### Using Release `v0.9.0`
33
72
 
34
- Users who have not pinned the theme version will be **automatically upgraded to `v0.8.0` the next time they build their site**.
73
+ Users who have not pinned the theme version will be **automatically upgraded to `v0.9.0` the next time they build their site**.
35
74
 
36
75
  To use this release explicitly as a remote theme:
37
76
 
@@ -601,7 +640,7 @@ We're so excited to release Just the Docs `v0.4.0`. This release has been almost
601
640
  - [callouts](https://just-the-docs.com/docs/ui-components/callouts/), a new design component to highlight content
602
641
  - [configuring mermaid.js](https://just-the-docs.com/docs/ui-components/code/#mermaid-diagram-code-blocks), a markdown-native diagram visualization library
603
642
  - [copy code button](https://just-the-docs.com/docs/ui-components/code/#copy-button) for code snippets
604
- - [external navigation links](https://just-the-docs.com/docs/navigation-structure/#external-navigation-links)
643
+ - external navigation links
605
644
  - major improvements to nav generation efficiency and robustness
606
645
  - minor improvements to built-in accessibility (SVG icons, nav titles, skip to main content)
607
646
  - [modularized site components](https://just-the-docs.com/docs/customization/#custom-layouts-and-includes) (advanced feature)
@@ -1,144 +1,96 @@
1
1
  {%- comment -%}
2
2
  Include as: {%- include components/breadcrumbs.html -%}
3
3
  Depends on: page, site.
4
+ Includes: components/site_nav.html.
4
5
  Results in: HTML for the breadcrumbs component.
5
6
  Overwrites:
6
- node, pages_list, parent_page, grandparent_page.
7
+ nav_list_link, site_nav, nav_list_simple, nav_list_link_class, nav_category,
8
+ nav_anchor_splits, nav_breadcrumbs, nav_split, nav_split_next, nav_split_test,
9
+ nav_breadcrumb_link, nav_list_end_less, nav_list_end_count, nav_end_index, nav_breadcrumb.
7
10
  {%- endcomment -%}
8
11
 
9
- {%- if page.url != "/" and page.parent -%}
12
+ {%- if page.url != "/" and page.parent and page.title -%}
10
13
 
11
14
  {%- capture nav_list_link -%}
12
15
  <a href="{{ page.url | relative_url }}" class="nav-list-link">
13
16
  {%- endcapture -%}
14
17
 
15
18
  {%- capture site_nav -%}
16
- {%- include_cached components/site_nav.html -%}
19
+ {%- include_cached components/site_nav.html all=true -%}
17
20
  {%- endcapture -%}
18
21
 
19
- {%- if site_nav contains nav_list_link -%}
20
-
21
- {%- capture nav_list_simple -%}
22
- <ul class="nav-list">
23
- {%- endcapture -%}
24
-
25
- {%- capture nav_list_link_class %} class="nav-list-link">
26
- {%- endcapture -%}
27
-
28
- {%- capture nav_category -%}
29
- <div class="nav-category">
30
- {%- endcapture -%}
31
-
32
- {%- assign nav_anchor_splits =
33
- site_nav | split: nav_list_link |
34
- first | split: nav_category |
35
- last | split: "</a>" -%}
36
-
37
- {%- comment -%}
38
- The ordinary pages (if any) and the collections pages (if any) are separated by
39
- occurrences of nav_category.
40
-
41
- Any ancestor nav-links of the page are contained in the last group of pages,
42
- immediately preceding nav-lists. After splitting at "</a>", the anchor that
43
- was split is a potential ancestor link when the following split starts with
44
- a nav-list.
45
-
46
- The array nav_breadcrumbs is the stack of current potential ancestors of the
47
- current page. A split that contains one or more "</ul>"s requires that number
48
- of potential ancestors to be popped from the stack.
49
-
50
- The number of occurrences of a string in nav_split_next is computed by removing
51
- them all, then dividing the resulting size difference by the length of the string.
52
- {%- endcomment %}
53
-
54
- {%- assign nav_breadcrumbs = "" | split: "" -%}
55
-
56
- {%- for nav_split in nav_anchor_splits -%}
57
- {%- unless forloop.last -%}
58
-
59
- {%- assign nav_split_next = nav_anchor_splits[forloop.index] | strip -%}
60
-
61
- {%- assign nav_split_test =
62
- nav_split_next | remove_first: nav_list_simple | prepend: nav_list_simple -%}
63
- {%- if nav_split_test == nav_split_next -%}
64
- {%- assign nav_breadcrumb_link =
65
- nav_split | split: "<a " | last | prepend: "<a " |
66
- replace: nav_list_link_class, ">" | append: "</a>" -%}
67
- {%- assign nav_breadcrumbs = nav_breadcrumbs | push: nav_breadcrumb_link -%}
68
- {%- endif -%}
69
-
70
- {%- if nav_split_next contains "</ul>" -%}
71
- {%- assign nav_list_end_less = nav_split_next | remove: "</ul>" -%}
72
- {%- assign nav_list_end_count =
73
- nav_split_next.size | minus: nav_list_end_less.size | divided_by: 5 -%}
74
- {% for nav_end_index in (1..nav_list_end_count) %}
75
- {%- assign nav_breadcrumbs = nav_breadcrumbs | pop -%}
76
- {%- endfor -%}
77
- {%- endif -%}
78
-
79
- {%- endunless -%}
80
- {%- endfor -%}
22
+ {%- capture nav_list_simple -%}
23
+ <ul class="nav-list">
24
+ {%- endcapture -%}
81
25
 
82
- {%- assign nav_parent_link = nav_breadcrumbs[-1] -%}
83
- {%- assign nav_grandparent_link = nav_breadcrumbs[-2] -%}
26
+ {%- capture nav_list_link_class %} class="nav-list-link">
27
+ {%- endcapture -%}
84
28
 
85
- {%- else -%}
29
+ {%- capture nav_category -%}
30
+ <div class="nav-category">
31
+ {%- endcapture -%}
86
32
 
87
- {%- comment -%}
88
- Pages whose links are excluded from the main navigation may still have
89
- breadcrumbs. Determining them appears to require inspecting the front matter
90
- of all the pages in the same group. For sites with 100s of pages, this is too
91
- inefficient in Jekyll 3 (also when the for-loop is replaced by where-filters).
92
- {%- endcomment -%}
33
+ {%- assign nav_anchor_splits =
34
+ site_nav | split: nav_list_link |
35
+ first | split: nav_category |
36
+ last | split: "</a>" -%}
93
37
 
94
- {%- assign pages_list = site[page.collection] | default: site.html_pages -%}
38
+ {%- comment -%}
39
+ The ordinary pages (if any) and the collections pages (if any) are separated by
40
+ occurrences of nav_category.
95
41
 
96
- {%- assign parent_page = nil -%}
97
- {%- assign grandparent_page = nil -%}
98
-
99
- {%- for node in pages_list -%}
42
+ Any ancestor nav-links of the page are contained in the last group of pages,
43
+ immediately preceding nav-lists. After splitting at "</a>", the anchor that
44
+ was split is a potential ancestor link when the following split starts with
45
+ a nav-list.
46
+
47
+ The array nav_breadcrumbs is the stack of current potential ancestors of the
48
+ current page. A split that contains one or more "</ul>"s requires that number
49
+ of potential ancestors to be popped from the stack.
100
50
 
101
- {%- if node.has_children and page.grand_parent -%}
51
+ The number of occurrences of a string in nav_split_next is computed by removing
52
+ them all, then dividing the resulting size difference by the length of the string.
53
+ {%- endcomment %}
102
54
 
103
- {%- if node.title == page.parent and node.parent == page.grand_parent -%}
104
- {%- assign parent_page = node -%}
105
- {%- endif -%}
106
- {%- if node.title == page.grand_parent -%}
107
- {%- assign grandparent_page = node -%}
108
- {%- endif -%}
109
- {%- if parent_page and grandparent_page -%}
110
- {%- break -%}
111
- {%- endif -%}
55
+ {%- assign nav_breadcrumbs = "" | split: "" -%}
112
56
 
113
- {%- elsif node.has_children and node.title == page.parent and node.parent == nil -%}
57
+ {%- for nav_split in nav_anchor_splits -%}
58
+ {%- unless forloop.last -%}
114
59
 
115
- {%- assign parent_page = node -%}
116
- {%- break -%}
60
+ {%- assign nav_split_next = nav_anchor_splits[forloop.index] | strip -%}
117
61
 
118
- {%- endif -%}
62
+ {%- assign nav_split_test =
63
+ nav_split_next | remove_first: nav_list_simple | prepend: nav_list_simple -%}
64
+ {%- if nav_split_test == nav_split_next -%}
65
+ {%- assign nav_breadcrumb_link =
66
+ nav_split | split: "<a " | last | prepend: "<a " |
67
+ replace: nav_list_link_class, ">" | append: "</a>" -%}
68
+ {%- assign nav_breadcrumbs = nav_breadcrumbs | push: nav_breadcrumb_link -%}
69
+ {%- endif -%}
119
70
 
71
+ {%- if nav_split_next contains "</ul>" -%}
72
+ {%- assign nav_list_end_less = nav_split_next | remove: "</ul>" -%}
73
+ {%- assign nav_list_end_count =
74
+ nav_split_next.size | minus: nav_list_end_less.size | divided_by: 5 -%}
75
+ {% for nav_end_index in (1..nav_list_end_count) %}
76
+ {%- assign nav_breadcrumbs = nav_breadcrumbs | pop -%}
120
77
  {%- endfor -%}
121
-
122
- {%- capture nav_parent_link -%}
123
- <a href="{{ parent_page.url | relative_url }}">{{ page.parent }}</a>
124
- {%- endcapture -%}
125
-
126
- {%- if page.grand_parent %}
127
- {%- capture nav_grandparent_link -%}
128
- <a href="{{ grandparent_page.url | relative_url }}">{{ page.grand_parent }}</a>
129
- {%- endcapture -%}
130
- {%- endif -%}
131
-
132
78
  {%- endif -%}
133
79
 
80
+ {%- endunless -%}
81
+ {%- endfor -%}
82
+
134
83
  <nav aria-label="Breadcrumb" class="breadcrumb-nav">
135
84
  <ol class="breadcrumb-nav-list">
136
- {%- if nav_grandparent_link %}
137
- <li class="breadcrumb-nav-list-item">{{ nav_grandparent_link }}</li>
138
- {%- endif %}
139
- <li class="breadcrumb-nav-list-item">{{ nav_parent_link }}</li>
85
+ {%- for nav_breadcrumb in nav_breadcrumbs %}
86
+ <li class="breadcrumb-nav-list-item">{{ nav_breadcrumb }}</li>
87
+ {%- endfor %}
140
88
  <li class="breadcrumb-nav-list-item"><span>{{ page.title }}</span></li>
141
89
  </ol>
142
90
  </nav>
143
91
 
92
+ {% if site.nav_error_report %}
93
+ {{ nav_error_report }}
94
+ {% endif %}
95
+
144
96
  {%- endif -%}
@@ -1,33 +1,89 @@
1
1
  {%- comment -%}
2
2
  Include as: {%- include components/children_nav.html -%}
3
- Depends on: page, site.
3
+ Depends on: page, site, nav_breadcrumbs.
4
4
  Results in: HTML for the children-navigation component.
5
- Includes:
6
- sorted_pages.html
7
- toc_heading_custom.html
5
+ Includes: components/nav/sorted.html, toc_heading_custom.html.
8
6
  Overwrites:
9
- child_pages.
7
+ nav_ancestor_links, nav_top_node_titles, nav_child_candidates, nav_children,
8
+ nav_child, nav_child_ok, nav_child_ancestor, nav_sorted.
10
9
  {%- endcomment -%}
11
10
 
12
- {%- if page.has_children == true and page.has_toc != false -%}
13
- {%- assign child_pages = site[page.collection]
14
- | default: site.html_pages
15
- | where: "parent", page.title
16
- | where: "grand_parent", page.parent -%}
11
+ {%- comment -%}
12
+ Whether a page has any children is checked efficiently by inspecting the cached
13
+ site_nav. If the page has no children, nav_children is set to an empty array;
14
+ otherwise nav_children is left unset.
15
+ {%- endcomment -%}
17
16
 
18
- {%- include sorted_pages.html pages = child_pages -%}
17
+ {%- if page.has_children == false -%}
18
+ {%- assign nav_children = "" | split: "" -%}
19
+ {%- else -%}
19
20
 
20
- {%- if page.child_nav_order == 'desc' or page.child_nav_order == 'reversed' -%}
21
- {%- assign sorted_pages = sorted_pages | reverse -%}
21
+ {%- assign nav_children = nil -%}
22
+
23
+ {%- capture nav_list_link -%}
24
+ <a href="{{ page.url | relative_url }}" class="nav-list-link">
25
+ {%- endcapture -%}
26
+
27
+ {%- capture site_nav -%}
28
+ {%- include_cached components/site_nav.html all=true -%}
29
+ {%- endcapture -%}
30
+
31
+ {%- capture nav_list_simple -%}
32
+ <ul class="nav-list">
33
+ {%- endcapture -%}
34
+
35
+ {%- assign nav_child_start = site_nav
36
+ | split: nav_list_link | last
37
+ | split: "</a>" | slice: 1 | first -%}
38
+
39
+ {%- assign nav_child_test = nav_child_start
40
+ | remove_first: nav_list_simple | prepend: nav_list_simple -%}
41
+
42
+ {%- if nav_child_start != nav_child_test -%}
43
+ {%- assign nav_children = "" | split: "" -%}
22
44
  {%- endif -%}
45
+
23
46
  {%- endif -%}
24
47
 
48
+ {%- unless nav_children -%}
49
+
50
+ {%- comment -%}
51
+ The layout is assumed to include components/breadcrumbs.html before this file,
52
+ otherwise it needs to be included here.
53
+ {%- endcomment -%}
54
+
55
+ {%- assign nav_ancestors = "" | split: "" -%}
56
+ {%- for nav_link in nav_breadcrumbs -%}
57
+ {%- assign nav_title = nav_link | split: ">" | slice: 1 | first | append: ">" | remove: "</a>" -%}
58
+ {%- assign nav_ancestors = nav_ancestors | push: nav_title -%}
59
+ {%- endfor -%}
60
+
61
+ {%- assign nav_parenthood = site[page.collection] | default: site.html_pages
62
+ | where_exp: "item", "item.title != nil" | group_by: "parent" -%}
63
+
64
+ {%- assign nav_top_nodes = nav_parenthood
65
+ | where_exp: "item", "item.name == ''" | map: "items" | first -%}
66
+
67
+ {% assign nav_top_node_titles = nav_top_nodes | map: "title" -%}
68
+
69
+ {%- include components/nav/children.html node=page ancestors=nav_ancestors all=true -%}
70
+
71
+ {%- endunless -%}
72
+
73
+ {%- if nav_children.size >= 1 -%}
74
+
75
+ {%- if page.child_nav_order == 'desc' or page.child_nav_order == 'reversed' -%}
76
+ {%- assign nav_children = nav_children | reverse -%}
77
+ {%- endif -%}
78
+
25
79
  <hr>
26
80
  {% include toc_heading_custom.html %}
27
81
  <ul>
28
- {% for child in sorted_pages %}
82
+ {% for nav_child in nav_children %}
29
83
  <li>
30
- <a href="{{ child.url | relative_url }}">{{ child.title }}</a>{% if child.summary %} - {{ child.summary }}{% endif %}
84
+ <a href="{{ nav_child.url | relative_url }}">{{ nav_child.title }}</a>{% if nav_child.summary %} - {{ nav_child.summary }}{% endif %}
31
85
  </li>
32
- {% endfor %}
86
+ {% endfor %}
33
87
  </ul>
88
+
89
+ {%- endif -%}
@@ -0,0 +1,48 @@
1
+ {%- comment -%}
2
+ Include as: {%- include components/nav/children.html node=node ancestors=title_array all=bool -%}
3
+ Depends on: include.node, include.ancestors, include.all, nav_parenthood, nav_top_node_titles.
4
+ Includes: components/nav/sorted.html.
5
+ Assigns to: nav_children.
6
+ Overwrites:
7
+ nav_candidates, nav_child, nav_child_ok.
8
+ {%- endcomment -%}
9
+
10
+ {%- assign nav_children = "" | split: "" -%}
11
+
12
+ {%- if include.all == true or include.node.has_children != false -%}
13
+
14
+ {%- assign nav_candidates = nav_parenthood
15
+ | where: "name", include.node.title | map: "items" | first -%}
16
+
17
+ {%- for nav_child in nav_candidates -%}
18
+ {%- assign nav_child_ok = true -%}
19
+
20
+ {%- if nav_child.grand_parent and nav_child.grand_parent != include.node.parent -%}
21
+ {%- assign nav_child_ok = false -%}
22
+ {%- endif -%}
23
+
24
+ {%- if nav_child.ancestor and nav_child.ancestor != include.node.title -%}
25
+ {%- unless include.ancestors contains nav_child.ancestor -%}
26
+ {%- assign nav_child_ok = false -%}
27
+ {%- endunless -%}
28
+ {%- endif -%}
29
+
30
+ {%- comment -%}
31
+ The following check rejects nav_child as 3rd-level when include.node is 2nd-level
32
+ and nav_child can also be 2nd-level. This is for backwards compatibility with
33
+ existing 3-level sites.
34
+ {%- endcomment -%}
35
+ {%- if nav_child.grand_parent == nil and nav_child.ancestor == nil and
36
+ nav_top_node_titles contains nav_child.parent and include.ancestors.size >= 1 -%}
37
+ {%- assign nav_child_ok = false -%}
38
+ {%- endif -%}
39
+
40
+ {%- if nav_child_ok -%}
41
+ {%- assign nav_children = nav_children | push: nav_child -%}
42
+ {%- endif -%}
43
+ {%- endfor -%}
44
+
45
+ {%- endif -%}
46
+
47
+ {%- include components/nav/sorted.html pages=nav_children -%}
48
+ {%- assign nav_children = nav_sorted -%}
@@ -0,0 +1,53 @@
1
+ {%- comment -%}
2
+ Include as: {%- include components/nav/links.html pages=page_array ancestors=title_array all=bool -%}
3
+ Depends on: include.pages, include.ancestors, include.all.
4
+ Results in: HTML for the main navigation when all is nil or false;
5
+ includes links to pages excluded from the main navigation when all is true.
6
+ Includes: components/nav/sorted.html, components/nav/children.html, components/nav/links.html.
7
+ Overwrites:
8
+ node, nav_children, nav_ancestors.
9
+ {%- endcomment -%}
10
+
11
+ <ul class="nav-list">
12
+ {%- for node in include.pages -%}
13
+ {%- if include.all == true or node.nav_exclude != true -%}
14
+
15
+ {%- if include.ancestors contains node.title -%}
16
+
17
+ <li class="nav-list-item">
18
+ <a href="{{ node.url | relative_url }}" class="nav-list-link"> ∞ </a>
19
+ </li>
20
+ {%- capture nav_error_report -%}
21
+ <blockquote class="warning">
22
+ A page has the same title as its parent page or one of its ancestral pages!<br>
23
+ This causes an incorrect link in the main navigation panel.<br>
24
+ Page title: <code>{{ node.title }}</code>, location: <code>{{ node.path }}</code>.
25
+ </blockquote>
26
+ {%- endcapture -%}
27
+
28
+ {%- else -%}
29
+
30
+ {%- include components/nav/children.html node=node ancestors=include.ancestors all=include.all -%}
31
+
32
+ <li class="nav-list-item">
33
+ {%- if nav_children.size >= 1 -%}
34
+ <button class="nav-list-expander btn-reset" aria-label="toggle items in {{ node.title }} category" aria-pressed="false">
35
+ <svg viewBox="0 0 24 24" aria-hidden="true"><use xlink:href="#svg-arrow-right"></use></svg>
36
+ </button>
37
+ {%- endif -%}
38
+ <a href="{{ node.url | relative_url }}" class="nav-list-link">{{ node.title }}</a>
39
+ {%- if nav_children.size >= 1 -%}
40
+ {%- if node.child_nav_order == 'desc' or node.child_nav_order == 'reversed' -%}
41
+ {%- assign nav_children = nav_children | reverse -%}
42
+ {%- endif -%}
43
+ {%- assign nav_ancestors = include.ancestors | push: node.title -%}
44
+ {%- include components/nav/links.html pages=nav_children ancestors=nav_ancestors all=include.all -%}
45
+ {%- endif -%}
46
+ </li>
47
+
48
+ {%- endif -%}
49
+
50
+ {%- endif -%}
51
+ {%- endfor -%}
52
+ </ul>
53
+ {%- comment -%}{%- endcomment -%}
@@ -0,0 +1,23 @@
1
+ {%- comment -%}
2
+ Include as: {%- include components/nav/pages.html pages=page_array all=bool -%}
3
+ Depends on: include.pages.
4
+ Results in: HTML for the main navigation when all is nil or false;
5
+ adds links to pages excluded from the main navigation when all is true.
6
+ Includes: components/nav/links.html
7
+ Assigns to:
8
+ nav_parenthood, nav_top_nodes, nav_top_node_titles, nav_ancestors.
9
+ {%- endcomment -%}
10
+
11
+ {%- assign nav_parenthood = include.pages
12
+ | where_exp: "item", "item.title != nil" | group_by: "parent" -%}
13
+
14
+ {%- assign nav_top_nodes = nav_parenthood
15
+ | where_exp: "item", "item.name == ''" | map: "items" | first -%}
16
+
17
+ {%- include components/nav/sorted.html pages=nav_top_nodes -%}
18
+
19
+ {% assign nav_top_node_titles = nav_top_nodes | map: "title" -%}
20
+
21
+ {%- assign nav_ancestors = "" | split: "" -%}
22
+
23
+ {%- include components/nav/links.html pages=nav_sorted ancestors=nav_ancestors all=include.all -%}
@@ -1,7 +1,7 @@
1
1
  {%- comment -%}
2
- Include as: {%- include sorted_pages.html pages=array_of_pages -%}
2
+ Include as: {%- include components/nav/sorted.html pages=page_array -%}
3
3
  Depends on: include.pages.
4
- Assigns to: sorted_pages.
4
+ Assigns to: nav_sorted.
5
5
  Overwrites:
6
6
  nav_order_pages, title_order_pages, double_quote, empty_array,
7
7
  nav_number_pages, nav_string_pages, nav_order_groups, group,
@@ -103,7 +103,7 @@
103
103
  {%- endif -%}
104
104
  {%- endunless -%}
105
105
 
106
- {%- assign sorted_pages = nav_number_pages
106
+ {%- assign nav_sorted = nav_number_pages
107
107
  | concat: nav_string_pages
108
108
  | concat: title_number_pages
109
109
  | concat: title_string_pages -%}
@@ -1,9 +1,10 @@
1
1
  {%- comment -%}
2
- Include as: {%- include_cached components/site_nav.html -%}
2
+ Include as: {%- include_cached components/site_nav.html all=bool -%}
3
3
  Depends on: site.
4
- Results in: HTML for the site-nav.
4
+ Results in: cached HTML for the main navigation when `all` is nil or false;
5
+ includes links to pages excluded from the main navigation when `all` is true.
5
6
  Includes:
6
- components/nav.html
7
+ components/nav/pages.html
7
8
  Overwrites:
8
9
  pages_top_size, collections_size, collection_entry,
9
10
  collection_key, collection_value, collection.
@@ -16,7 +17,7 @@
16
17
  | where_exp:"item", "item.nav_exclude != true"
17
18
  | size %}
18
19
  {% if pages_top_size > 0 %}
19
- {% include components/nav.html pages=site.html_pages %}
20
+ {% include components/nav/pages.html pages=site.html_pages all=include.all %}
20
21
  {% endif %}
21
22
  {%- if site.nav_external_links -%}
22
23
  <ul class="nav-list">
@@ -51,17 +52,21 @@
51
52
  </button>
52
53
  {%- endif -%}
53
54
  <div class="nav-category">{{ collection_value.name }}</div>
54
- {% include components/nav.html pages=collection %}
55
+ {% include components/nav/pages.html pages=collection all=include.all %}
55
56
  </li>
56
57
  </ul>
57
58
  {% else %}
58
59
  <div class="nav-category">{{ collection_value.name }}</div>
59
- {% include components/nav.html pages=collection %}
60
+ {% include components/nav/pages.html pages=collection all=include.all %}
60
61
  {% endif %}
61
62
  {% else %}
62
- {% include components/nav.html pages=collection %}
63
+ {% include components/nav/pages.html pages=collection all=include.all %}
63
64
  {% endif %}
64
65
  {% endif %}
65
66
  {% endfor %}
66
67
  {% endif %}
67
68
  </nav>
69
+
70
+ {% if site.nav_error_report %}
71
+ {{ nav_error_report }}
72
+ {%- endif %}
@@ -21,18 +21,18 @@
21
21
  {%- endcomment -%}
22
22
 
23
23
  {%- capture activation_no_nav_link %}
24
- .site-nav ul li a {
25
- background-image: none;
26
- }
27
-
28
- {%- if site.just_the_docs.collections %}
29
- .site-nav > ul.nav-category-list > li > button svg {
30
- transform: rotate(-90deg);
31
- }
32
- .site-nav > ul.nav-category-list > li.nav-list-item > ul.nav-list {
33
- display: block;
34
- }
35
- {%- endif %}
24
+ .site-nav ul li a {
25
+ background-image: none;
26
+ }
27
+
28
+ {%- if site.just_the_docs.collections %}
29
+ .site-nav > ul.nav-category-list > li > button svg {
30
+ transform: rotate(-90deg);
31
+ }
32
+ .site-nav > ul.nav-category-list > li.nav-list-item > ul.nav-list {
33
+ display: block;
34
+ }
35
+ {%- endif %}
36
36
  {% endcapture -%}
37
37
 
38
38
  {%- capture nav_list_link -%}
@@ -45,288 +45,281 @@
45
45
 
46
46
  {%- if site_nav contains nav_list_link -%}
47
47
 
48
- {%- capture nav_list -%}
49
- <ul class="nav-list
50
- {%- endcapture -%}
48
+ {%- capture nav_list -%}
49
+ <ul class="nav-list
50
+ {%- endcapture -%}
51
51
 
52
- {%- assign nav_list_end = "</ul>" -%}
52
+ {%- assign nav_list_end = "</ul>" -%}
53
53
 
54
- {%- capture nav_list_item -%}
55
- <li class="nav-list-item
56
- {%- endcapture -%}
54
+ {%- capture nav_list_item -%}
55
+ <li class="nav-list-item
56
+ {%- endcapture -%}
57
57
 
58
- {%- capture nav_category_list -%}
59
- <ul class="nav-list nav-category-list">
60
- {%- endcapture -%}
58
+ {%- capture nav_category_list -%}
59
+ <ul class="nav-list nav-category-list">
60
+ {%- endcapture -%}
61
61
 
62
- {%- assign nav_list_link_prefix =
63
- site_nav | split: nav_list_link | first | append: nav_list_link -%}
62
+ {%- assign nav_list_link_prefix =
63
+ site_nav | split: nav_list_link | first | append: nav_list_link -%}
64
64
 
65
- {%- assign nav_splits =
66
- nav_list_link_prefix | split: nav_list_item | pop -%}
65
+ {%- assign nav_splits =
66
+ nav_list_link_prefix | split: nav_list_item | pop -%}
67
67
 
68
- {%- assign nav_levels = "" | split: "" | push: 1 -%}
68
+ {%- assign nav_levels = "" | split: "" | push: 1 -%}
69
69
 
70
- {%- comment -%}
71
- The pattern of occurrences of list and list-item tags in the site_nav string
72
- is included in the language defined by the following context-free grammar:
73
-
74
- site_nav = PAGES? EXTERNALS? COLLECTION*
75
-
76
- PAGES = nav_list (nav_list_item PAGES?)+ nav_list_end
77
-
78
- EXTERNALS = nav_list nav_list_item+ nav_list_end
79
-
80
- COLLECTION = nav_list (nav_list_item PAGES?)* nav_list_end
81
- | nav_category_list
82
- nav_list_item nav_list (nav_list_item PAGES?)* nav_list_end
83
- nav_list_end
84
-
85
- To determine the path in the site_nav to the nav_list_link for the current page,
86
- the prefix of nav_list_link in site_nav is split at each nav_list_item to give
87
- an array of nav_splits.
88
-
89
- In site_nav, occurrences of nav_list must be separated by at least one
90
- nav_list_item or nav_list_end. Moreover, when a nav_list_end is followed by a
91
- nav_list without an intervening nav_list_item, that nav_list must start either
92
- a list of external links or a collection. And when a nav_list is followed by a
93
- nav_list_end without an intervening nav_list_item, they form an empty collection.
94
-
95
- nav_levels is the path determined by the previously inspected nav_splits.
96
- How many times nav_list and nav_list_end occur in the current nav_split
97
- determines how to update the path.
98
-
99
- A nav_split can contain any number of empty non-foldable collections.
100
- The path element produced by the outer nav_list of a foldable collection is
101
- irrelevant; it is set to zero and subsequently removed.
102
-
103
- The number of occurrences of a string in a nav_split is computed by removing
104
- them all, then dividing the resulting size difference by the length of the string.
105
-
106
- Case analysis on (nav_list_count, nav_list_end_count):
107
-
108
- - when (0, 0), the nav_split was between two nav_list_items at the same level;
109
-
110
- - when (0, N+1), all the nav_list_ends in the nav_split are in PAGES or in one
111
- COLLECTION;
70
+ {%- comment -%}
71
+ The pattern of occurrences of list and list-item tags in the site_nav string
72
+ is included in the language defined by the following context-free grammar:
112
73
 
113
- - when (M+1, 0), M must be 0 (because two nav_lists in the same nav_split must
114
- be separated by at least one nav_list_end);
115
-
116
- - when (M+1, N+1), the nav_split must contain either:
117
- - the end of PAGES followed by the start of EXTERNALS, or
118
- - the end of PAGES followed by the start of a COLLECTION, or
119
- - the end of EXTERNALS followed by the start of a COLLECTION, or
120
- - the end of one COLLECTION followed by the start of another, or
121
- - (in the first nav_split) one or more empty non-foldable COLLECTIONS
122
- followed by the start of a COLLECTION.
123
- In general, nav_levels[0] here needs to be incremented by nav_list_count.
124
- However, a nav_split that contains the end of an empty foldable collection
125
- followed by the just the start of a collection has two occurrences of nav_list,
126
- and the increment needs to be one less; similarly when the first nav_split
127
- starts with an empty non-foldable collection.
128
- {%- endcomment %}
129
-
130
- {%- for nav_split in nav_splits -%}
131
-
132
- {%- assign nav_list_less = nav_split | remove: nav_list -%}
133
- {%- assign nav_list_count =
134
- nav_split.size | minus: nav_list_less.size |
135
- divided_by: nav_list.size -%}
136
-
137
- {%- assign nav_list_end_less = nav_split | remove: nav_list_end -%}
138
- {%- assign nav_list_end_count =
139
- nav_split.size | minus: nav_list_end_less.size |
140
- divided_by: nav_list_end.size -%}
141
-
142
- {%- if nav_list_count == 0 and nav_list_end_count == 0 -%}
143
-
144
- {%- assign nav_index = nav_levels[-1] | plus: 1 -%}
145
- {%- assign nav_levels = nav_levels | pop | push: nav_index -%}
146
-
147
- {%- elsif nav_list_count == 0 and nav_list_end_count >= 1 -%}
148
-
149
- {%- assign nav_slice_size = nav_levels.size | minus: nav_list_end_count -%}
150
- {%- assign nav_levels = nav_levels | slice: 0, nav_slice_size -%}
151
- {%- assign nav_index = nav_levels[-1] | plus: 1 -%}
152
- {%- assign nav_levels = nav_levels | pop | push: nav_index -%}
153
-
154
- {%- elsif nav_list_count == 1 and nav_list_end_count == 0 -%}
155
-
156
- {%- if nav_split contains nav_category_list -%}
157
- {%- assign nav_levels = nav_levels | push: 0 -%}
158
- {%- else -%}
159
- {%- assign nav_levels = nav_levels | push: 1 -%}
160
- {%- endif -%}
161
-
162
- {%- elsif nav_list_count >= 1 and nav_list_end_count >= 1 -%}
163
-
164
- {%- assign nav_index = nav_levels[0] | plus: nav_list_count -%}
165
- {%- if nav_levels[-1] == 0 or forloop.first -%}
166
- {%- assign nav_index = nav_index | minus: 1 -%}
167
- {%- endif -%}
168
- {%- assign nav_levels = nav_levels | slice: 0, 0 | push: nav_index -%}
169
- {%- if nav_split contains nav_category_list -%}
170
- {%- assign nav_levels = nav_levels | push: 0 -%}
171
- {%- else -%}
172
- {%- assign nav_levels = nav_levels | push: 1 -%}
173
- {%- endif -%}
174
-
175
- {%- endif -%}
176
-
177
- {%- endfor -%}
74
+ site_nav = PAGES? EXTERNALS? COLLECTION*
178
75
 
179
- {%- assign nav_levels = nav_levels | where_exp: "item", "item >= 1" -%}
76
+ PAGES = nav_list (nav_list_item PAGES?)+ nav_list_end
180
77
 
181
- {%- endif -%}
78
+ EXTERNALS = nav_list nav_list_item+ nav_list_end
182
79
 
183
- {%- comment -%}
184
- The generated CSS depends on the position of the current page in each level in
185
- the navigation.
186
- {%- endcomment -%}
80
+ COLLECTION = nav_list (nav_list_item PAGES?)* nav_list_end
81
+ | nav_category_list
82
+ nav_list_item nav_list (nav_list_item PAGES?)* nav_list_end
83
+ nav_list_end
84
+
85
+ To determine the path in the site_nav to the nav_list_link for the current page,
86
+ the prefix of nav_list_link in site_nav is split at each nav_list_item to give
87
+ an array of nav_splits.
88
+
89
+ In site_nav, occurrences of nav_list must be separated by at least one
90
+ nav_list_item or nav_list_end. Moreover, when a nav_list_end is followed by a
91
+ nav_list without an intervening nav_list_item, that nav_list must start either
92
+ a list of external links or a collection. And when a nav_list is followed by a
93
+ nav_list_end without an intervening nav_list_item, they form an empty collection.
94
+
95
+ nav_levels is the path determined by the previously inspected nav_splits.
96
+ How many times nav_list and nav_list_end occur in the current nav_split
97
+ determines how to update the path.
98
+
99
+ A nav_split can contain any number of empty non-foldable collections.
100
+ The path element produced by the outer nav_list of a foldable collection is
101
+ irrelevant; it is set to zero and subsequently removed.
102
+
103
+ The number of occurrences of a string in a nav_split is computed by removing
104
+ them all, then dividing the resulting size difference by the length of the string.
105
+
106
+ Case analysis on (nav_list_count, nav_list_end_count):
107
+
108
+ - when (0, 0), the nav_split was between two nav_list_items at the same level;
109
+
110
+ - when (0, N+1), all the nav_list_ends in the nav_split are in PAGES or in one
111
+ COLLECTION;
112
+
113
+ - when (M+1, 0), M must be 0 (because two nav_lists in the same nav_split must
114
+ be separated by at least one nav_list_end);
115
+
116
+ - when (M+1, N+1), the nav_split must contain either:
117
+ - the end of PAGES followed by the start of EXTERNALS, or
118
+ - the end of PAGES followed by the start of a COLLECTION, or
119
+ - the end of EXTERNALS followed by the start of a COLLECTION, or
120
+ - the end of one COLLECTION followed by the start of another, or
121
+ - (in the first nav_split) one or more empty non-foldable COLLECTIONS
122
+ followed by the start of a COLLECTION.
123
+ In general, nav_levels[0] here needs to be incremented by nav_list_count.
124
+ However, a nav_split that contains the end of an empty foldable collection
125
+ followed by the just the start of a collection has two occurrences of nav_list,
126
+ and the increment needs to be one less; similarly when the first nav_split
127
+ starts with an empty non-foldable collection.
128
+ {%- endcomment %}
129
+
130
+ {%- for nav_split in nav_splits -%}
131
+
132
+ {%- assign nav_list_less = nav_split | remove: nav_list -%}
133
+ {%- assign nav_list_count =
134
+ nav_split.size | minus: nav_list_less.size |
135
+ divided_by: nav_list.size -%}
136
+
137
+ {%- assign nav_list_end_less = nav_split | remove: nav_list_end -%}
138
+ {%- assign nav_list_end_count =
139
+ nav_split.size | minus: nav_list_end_less.size |
140
+ divided_by: nav_list_end.size -%}
141
+
142
+ {%- if nav_list_count == 0 and nav_list_end_count == 0 -%}
143
+
144
+ {%- assign nav_index = nav_levels[-1] | plus: 1 -%}
145
+ {%- assign nav_levels = nav_levels | pop | push: nav_index -%}
146
+
147
+ {%- elsif nav_list_count == 0 and nav_list_end_count >= 1 -%}
148
+
149
+ {%- assign nav_slice_size = nav_levels.size | minus: nav_list_end_count -%}
150
+ {%- assign nav_levels = nav_levels | slice: 0, nav_slice_size -%}
151
+ {%- assign nav_index = nav_levels[-1] | plus: 1 -%}
152
+ {%- assign nav_levels = nav_levels | pop | push: nav_index -%}
153
+
154
+ {%- elsif nav_list_count == 1 and nav_list_end_count == 0 -%}
155
+
156
+ {%- if nav_split contains nav_category_list -%}
157
+ {%- assign nav_levels = nav_levels | push: 0 -%}
158
+ {%- else -%}
159
+ {%- assign nav_levels = nav_levels | push: 1 -%}
160
+ {%- endif -%}
161
+
162
+ {%- elsif nav_list_count >= 1 and nav_list_end_count >= 1 -%}
163
+
164
+ {%- assign nav_index = nav_levels[0] | plus: nav_list_count -%}
165
+ {%- if nav_levels[-1] == 0 or forloop.first -%}
166
+ {%- assign nav_index = nav_index | minus: 1 -%}
167
+ {%- endif -%}
168
+ {%- assign nav_levels = nav_levels | slice: 0, 0 | push: nav_index -%}
169
+ {%- if nav_split contains nav_category_list -%}
170
+ {%- assign nav_levels = nav_levels | push: 0 -%}
171
+ {%- else -%}
172
+ {%- assign nav_levels = nav_levels | push: 1 -%}
173
+ {%- endif -%}
187
174
 
188
- {%- if nav_levels[1] == nil -%}
175
+ {%- endif -%}
189
176
 
190
- {{ activation_no_nav_link }}
177
+ {%- endfor -%}
191
178
 
192
- {%- else -%}
179
+ {%- assign nav_levels = nav_levels | where_exp: "item", "item >= 1" -%}
193
180
 
194
- {%- if nav_levels[2] == nil and nav_levels[3] -%}
181
+ {%- comment -%}
182
+ The generated CSS depends on the position of the current page in each level in
183
+ the navigation.
195
184
 
196
- {{ activation_no_nav_link }}
185
+ nav_page_level is the depth of the navigation hierarchy (ignoring collections).
186
+ In existing 3-level sites, nav_page_level <= 3.
187
+ In multi-level sites, nav_page_level is unbounded.
188
+ {%- endcomment -%}
197
189
 
198
- {%- else -%}
190
+ {%- assign nav_page_level = nav_levels.size | minus: 1 -%}
191
+ {%- assign nav_page_parent_level = nav_page_level | minus: 1 -%}
192
+ {%- assign nav_page_grandparent_level = nav_page_level | minus: 2 -%}
199
193
 
200
- {%- comment -%}
201
- The site-nav is:
202
- - an optional ul.nav-list with li.nav-list-items for non-collection top-level pages
203
- - an optional ul.nav-list with li.nav-list-item.externals
204
- - any number of just-the-docs.collections
205
-
206
- A non-foldable collection is:
207
- - a div.nav-category with the collection name, followed by:
208
- - a ul.nav-list with li.nav-list-items for its top-level pages
209
-
210
- A foldable collection is:
211
- - a ul.nav-list.nav-category-list with a single li.nav-list-item containing:
212
- - an optional button with the expander svg
213
- - a div.nav-category with the collection name
194
+ {%- comment -%}
195
+ The site-nav is:
196
+ - an optional ul.nav-list with li.nav-list-items for non-collection top-level pages
197
+ - an optional ul.nav-list with li.nav-list-item.externals
198
+ - any number of just-the-docs.collections
199
+
200
+ A non-foldable collection is:
201
+ - a div.nav-category with the collection name, followed by:
214
202
  - a ul.nav-list with li.nav-list-items for its top-level pages
215
-
216
- The generated CSS uses:
217
- - activation_collection_prefix, to select the site-nav > ul.nav-list for the page
218
- - activation_other_collection_prefix, to select all the other site-nav > ul.nav-lists
219
- {%- endcomment -%}
220
-
221
- {%- if page.collection == nil -%}
222
-
223
- {%- capture activation_collection_prefix -%}
224
- .site-nav > ul.nav-list:first-child
225
- {%- endcapture -%}
226
-
227
- {%- capture activation_other_collection_prefix -%}
228
- .site-nav > ul.nav-list:not(:first-child)
229
- {%- endcapture -%}
203
+
204
+ A foldable collection is:
205
+ - a ul.nav-list.nav-category-list with a single li.nav-list-item containing:
206
+ - an optional button with the expander svg
207
+ - a div.nav-category with the collection name
208
+ - a ul.nav-list with li.nav-list-items for its top-level pages
209
+
210
+ The generated CSS uses:
211
+ - activation_collection_prefix, to select the site-nav > ul.nav-list for the page
212
+ - activation_other_collection_prefix, to select all the other site-nav > ul.nav-lists
213
+ {%- endcomment -%}
230
214
 
231
- {%- else -%}
215
+ {%- if page.collection == nil -%}
232
216
 
233
- {%- capture activation_collection_prefix -%}
234
- .site-nav > ul:nth-of-type({{ nav_levels[0] }})
235
- {%- if site.just_the_docs.collections[page.collection].nav_fold %} > li > ul
236
- {%- endif -%}
237
- {%- endcapture -%}
238
-
239
- {%- capture activation_other_collection_prefix -%}
240
- .site-nav > ul:not(:nth-of-type({{ nav_levels[0] }}))
241
- {%- endcapture -%}
217
+ {%- capture activation_collection_prefix -%}
218
+ .site-nav > ul.nav-list:first-child
219
+ {%- endcapture -%}
242
220
 
243
- {%- endif -%}
221
+ {%- capture activation_other_collection_prefix -%}
222
+ .site-nav > ul.nav-list:not(:first-child)
223
+ {%- endcapture -%}
244
224
 
245
- {%- comment -%}
246
- The required background image of the link to the current page may involve SCSS.
247
- To avoid page-dependent SCSS, all nav links initially have that background image.
248
- The following rule removes the image from the links to all parents, siblings,
249
- and children of the current page.
250
- {%- endcomment %}
225
+ {%- else -%}
251
226
 
252
- {% if nav_levels[3] -%}
227
+ {%- capture activation_collection_prefix -%}
228
+ .site-nav > ul:nth-of-type({{ nav_levels[0] }})
229
+ {%- if site.just_the_docs.collections[page.collection].nav_fold %} > li > ul
230
+ {%- endif -%}
231
+ {%- endcapture -%}
253
232
 
254
- {{ activation_collection_prefix }} > li > a,
255
- {{ activation_collection_prefix }} > li > ul > li > a,
256
- {{ activation_collection_prefix }} > li > ul > li > ul > li:not(:nth-child({{ nav_levels[3] }})) > a {
257
- background-image: none;
258
- }
233
+ {%- capture activation_other_collection_prefix -%}
234
+ .site-nav > ul:not(:nth-of-type({{ nav_levels[0] }}))
235
+ {%- endcapture -%}
259
236
 
260
- {%- elsif nav_levels[2] -%}
237
+ {%- endif -%}
261
238
 
262
- {{ activation_collection_prefix }} > li > a,
263
- {{ activation_collection_prefix }} > li > ul > li:not(:nth-child({{ nav_levels[2] }})) > a,
264
- {{ activation_collection_prefix }} > li > ul > li > ul > li > a {
265
- background-image: none;
266
- }
239
+ {%- comment -%}
240
+ The required background image of the link to the current page may involve SCSS.
241
+ To avoid page-dependent SCSS, all nav links initially have that background image.
242
+ The following rule removes the image from the links to all parents, siblings,
243
+ and children of the current page.
244
+ {%- endcomment %}
245
+
246
+ {% if nav_page_level >= 2 -%}
247
+ {%- for i in (1..nav_page_parent_level) -%}
248
+ {{ activation_collection_prefix }} >
249
+ {%- for j in (2..i) %} li > ul >
250
+ {%- endfor %} li > a,
251
+ {% endfor -%}
252
+ {%- endif %}
253
+ {{ activation_collection_prefix }} >
254
+ {%- for i in (1..nav_page_parent_level) %} li > ul >
255
+ {%- endfor %} li:not(:nth-child({{ nav_levels[nav_page_level] }})) > a,
256
+ {{ activation_collection_prefix }} >
257
+ {%- for i in (1..nav_page_level) %} li > ul >
258
+ {%- endfor %} li a {
259
+ background-image: none;
260
+ }
261
+
262
+ {%- comment -%}
263
+ The following rule removes the image from the links to pages in other collections.
264
+ {%- endcomment %}
265
+
266
+ {{ activation_other_collection_prefix }} a,
267
+ .site-nav li.external a {
268
+ background-image: none;
269
+ }
270
+
271
+ {%- comment -%}
272
+ The following rule styles the link to the current page.
273
+ {%- endcomment %}
274
+
275
+ {{ activation_collection_prefix }} > li:nth-child({{ nav_levels[1] }})
276
+ {%- for i in (2..nav_page_level) %} > ul > li:nth-child({{ nav_levels[i] }})
277
+ {%- endfor %} > a {
278
+ font-weight: 600;
279
+ text-decoration: none;
280
+ }
281
+
282
+ {%- comment -%}
283
+ The following rules unfold all collections, and display the links to any children
284
+ of the current page.
285
+
286
+ To avoid dependence on the SCSS variable nav-list-expander-right, the direction
287
+ of the rotation of the expander icon is fixed, and corresponds to the appearance
288
+ when nav-list-expander-right is true. This results in a minor visual difference
289
+ between the appearance of active expander icons when JS is enabled/disabled and
290
+ nav-list-expander-right is false, which seems unavoidable.
291
+ {%- endcomment %}
292
+
293
+ {%- if site.just_the_docs.collections %}
294
+ .site-nav > ul.nav-category-list > li > button svg,
295
+ {% endif -%}
296
+ {{ activation_collection_prefix }} > li:nth-child({{ nav_levels[1] }}) > button svg
297
+ {%- for i in (2..nav_page_level) %},
298
+ {{ activation_collection_prefix }} > li:nth-child({{ nav_levels[1] }}) >
299
+ {%- for j in (2..i) %} ul > li:nth-child({{ nav_levels[j] }}) >
300
+ {%- endfor %} button svg
301
+ {%- endfor %} {
302
+ transform: rotate(-90deg);
303
+ }
304
+
305
+ {%- if site.just_the_docs.collections %}
306
+ .site-nav > ul.nav-category-list > li.nav-list-item > ul.nav-list,
307
+ {% endif -%}
308
+ {{ activation_collection_prefix }} > li.nav-list-item:nth-child({{ nav_levels[1] }}) > ul.nav-list
309
+ {%- for i in (2..nav_page_level) %},
310
+ {{ activation_collection_prefix }} > li.nav-list-item:nth-child({{ nav_levels[1] }}) >
311
+ {%- for j in (2..i) %} ul.nav-list > li.nav-list-item:nth-child({{ nav_levels[j] }}) >
312
+ {%- endfor %} ul.nav-list
313
+ {%- endfor %} {
314
+ display: block;
315
+ }
267
316
 
268
317
  {%- else -%}
269
318
 
270
- {{ activation_collection_prefix }} > li:not(:nth-child({{ nav_levels[1] }})) > a,
271
- {{ activation_collection_prefix }} > li > ul > li > a,
272
- {{ activation_collection_prefix }} > li > ul > li > ul > li > a {
273
- background-image: none;
274
- }
275
-
276
- {%- endif %}
277
-
278
- {%- comment -%}
279
- The following rule removes the image from the links to pages in other collections.
280
- {%- endcomment %}
319
+ {%- comment -%}
320
+ not site_nav contains nav_list_link
321
+ {%- endcomment -%}
281
322
 
282
- {{ activation_other_collection_prefix }} a,
283
- .site-nav li.external a {
284
- background-image: none;
285
- }
323
+ {{ activation_no_nav_link }}
286
324
 
287
- {%- comment -%}
288
- The following rule styles the link to the current page.
289
- {%- endcomment %}
290
-
291
- {{ activation_collection_prefix }} > li:nth-child({{ nav_levels[1] }})
292
- {%- if nav_levels[2] %} > ul > li:nth-child({{ nav_levels[2] }})
293
- {%- if nav_levels[3] %} > ul > li:nth-child({{ nav_levels[3] }})
294
- {%- endif -%}
295
- {%- endif %} > a {
296
- font-weight: 600;
297
- text-decoration: none;
298
- }
299
-
300
- {%- comment -%}
301
- The following rules unfold all collections, and display the links to any children
302
- of the current page.
303
-
304
- To avoid dependence on the SCSS variable nav-list-expander-right, the direction
305
- of the rotation of the expander icon is fixed, and corresponds to the appearance
306
- when nav-list-expander-right is true. This results in a minor visual difference
307
- between the appearance of active expander icons when JS is enabled/disabled and
308
- nav-list-expander-right is false, which seems unavoidable.
309
- {%- endcomment %}
310
-
311
- {%- if site.just_the_docs.collections %}
312
- .site-nav > ul.nav-category-list > li > button svg,
313
- {% endif -%}
314
- {{ activation_collection_prefix }} > li:nth-child({{ nav_levels[1] }}) > button svg
315
- {%- if nav_levels[2] -%},
316
- {{ activation_collection_prefix }} > li:nth-child({{ nav_levels[1] }}) > ul > li:nth-child({{ nav_levels[2] }}) > button svg
317
- {%- endif %} {
318
- transform: rotate(-90deg);
319
- }
320
-
321
- {%- if site.just_the_docs.collections %}
322
- .site-nav > ul.nav-category-list > li.nav-list-item > ul.nav-list,
323
- {% endif -%}
324
- {{ activation_collection_prefix }} > li.nav-list-item:nth-child({{ nav_levels[1] }}) > ul.nav-list
325
- {%- if nav_levels[2] %},
326
- {{ activation_collection_prefix }} > li.nav-list-item:nth-child({{ nav_levels[1] }}) > ul.nav-list > li.nav-list-item:nth-child({{ nav_levels[2] }}) > ul.nav-list
327
- {%- endif %} {
328
- display: block;
329
- }
330
-
331
- {%- endif -%}
332
325
  {%- endif -%}
@@ -28,7 +28,7 @@ layout: table_wrappers
28
28
  {{ content }}
29
29
  {% endif %}
30
30
 
31
- {% if page.has_children == true and page.has_toc != false %}
31
+ {% if page.has_toc != false %}
32
32
  {% include components/children_nav.html %}
33
33
  {% endif %}
34
34
  </main>
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: just-the-docs
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.0
4
+ version: 0.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Patrick Marsceill
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2024-08-12 00:00:00.000000000 Z
12
+ date: 2024-09-09 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -100,7 +100,10 @@ files:
100
100
  - _includes/components/footer.html
101
101
  - _includes/components/header.html
102
102
  - _includes/components/mermaid.html
103
- - _includes/components/nav.html
103
+ - _includes/components/nav/children.html
104
+ - _includes/components/nav/links.html
105
+ - _includes/components/nav/pages.html
106
+ - _includes/components/nav/sorted.html
104
107
  - _includes/components/search_footer.html
105
108
  - _includes/components/search_header.html
106
109
  - _includes/components/sidebar.html
@@ -129,7 +132,6 @@ files:
129
132
  - _includes/mermaid_config.js
130
133
  - _includes/nav_footer_custom.html
131
134
  - _includes/search_placeholder_custom.html
132
- - _includes/sorted_pages.html
133
135
  - _includes/title.html
134
136
  - _includes/toc_heading_custom.html
135
137
  - _includes/vendor/anchor_headings.html
@@ -1,75 +0,0 @@
1
- {%- comment -%}
2
- Include as: {%- include components/nav.html pages=pages -%}
3
- Depends on: include.pages.
4
- Results in: HTML for the navigation panel.
5
- Includes:
6
- sorted_pages.html
7
- Overwrites:
8
- nav_pages, first_level_pages, second_level_pages, third_level_pages,
9
- node, children_list, child, grand_children_list, grand_child.
10
- {%- endcomment -%}
11
-
12
- {%- assign nav_pages = include.pages
13
- | where_exp: "item", "item.title != nil"
14
- | where_exp: "item", "item.nav_exclude != true" -%}
15
-
16
- {%- include sorted_pages.html pages = nav_pages -%}
17
-
18
- {%- comment -%}
19
- It might be more efficient to sort the pages at each level separately.
20
- {%- endcomment -%}
21
-
22
- {%- assign first_level_pages = sorted_pages
23
- | where_exp: "item", "item.parent == nil" -%}
24
- {%- assign second_level_pages = sorted_pages
25
- | where_exp: "item", "item.parent != nil"
26
- | where_exp: "item", "item.grand_parent == nil" -%}
27
- {%- assign third_level_pages = sorted_pages
28
- | where_exp: "item", "item.grand_parent != nil" -%}
29
-
30
- <ul class="nav-list">
31
- {%- for node in first_level_pages -%}
32
- <li class="nav-list-item">
33
- {%- if node.has_children -%}
34
- <button class="nav-list-expander btn-reset" aria-label="toggle items in {{ node.title }} category" aria-pressed="false">
35
- <svg viewBox="0 0 24 24" aria-hidden="true"><use xlink:href="#svg-arrow-right"></use></svg>
36
- </button>
37
- {%- endif -%}
38
- <a href="{{ node.url | relative_url }}" class="nav-list-link">{{ node.title }}</a>
39
- {%- if node.has_children -%}
40
- {%- assign children_list = second_level_pages
41
- | where: "parent", node.title -%}
42
- {%- if node.child_nav_order == 'desc' or node.child_nav_order == 'reversed' -%}
43
- {%- assign children_list = children_list | reverse -%}
44
- {%- endif -%}
45
- <ul class="nav-list">
46
- {%- for child in children_list -%}
47
- <li class="nav-list-item">
48
- {%- if child.has_children -%}
49
- <button class="nav-list-expander btn-reset" aria-label="toggle items in {{ child.title }} category" aria-pressed="false">
50
- <svg viewBox="0 0 24 24" aria-hidden="true"><use xlink:href="#svg-arrow-right"></use></svg>
51
- </button>
52
- {%- endif -%}
53
- <a href="{{ child.url | relative_url }}" class="nav-list-link">{{ child.title }}</a>
54
- {%- if child.has_children -%}
55
- {%- assign grand_children_list = third_level_pages
56
- | where: "parent", child.title
57
- | where: "grand_parent", node.title -%}
58
- {%- if child.child_nav_order == 'desc' or child.child_nav_order == 'reversed' -%}
59
- {%- assign grand_children_list = grand_children_list | reverse -%}
60
- {%- endif -%}
61
- <ul class="nav-list">
62
- {%- for grand_child in grand_children_list -%}
63
- <li class="nav-list-item">
64
- <a href="{{ grand_child.url | relative_url }}" class="nav-list-link">{{ grand_child.title }}</a>
65
- </li>
66
- {%- endfor -%}
67
- </ul>
68
- {%- endif -%}
69
- </li>
70
- {%- endfor -%}
71
- </ul>
72
- {%- endif -%}
73
- </li>
74
- {%- endfor -%}
75
- </ul>