elixir-toolkit-theme 4.2.0 → 5.0.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: 140b7c66e0c04dfbbe10dc5492792c43c88d6a871f74f73a48f317ba7bcb80d6
4
- data.tar.gz: 1dbd0f382dc4e151582c1bee5bbc596be339281a62b8d90fab3baf2ab79d1695
3
+ metadata.gz: 28d3405180b694d3008b2189a0bb9a16ee0ea46295d1d9e1f54b0c0615dc08c1
4
+ data.tar.gz: b84be0a971922c139d39379443cddd58f07514d5578c7d38364dc1361c63484f
5
5
  SHA512:
6
- metadata.gz: 6d078fc983828cfd6744289648dd8f609d5364d8eb8eb80de04863879cb57840b73f988ed8500a9a0e14b3c3364b953552fe0182f396f2ffa75ac67af825f32b
7
- data.tar.gz: 2563b4a109f9682e11bc96e550dd7c13e4ee5c6ad3404739d0f3ccf871cd995520a6d1914526a87fbda26890c01011f7803c15905f1f701ee6374863fad0f395
6
+ metadata.gz: e72c7d4ed2724a743f37e71223547bdfa2dbd472d050ecb4a8e130d6081bf3c4a1bd9fbd2d4136c58616484bd7bb189a472ca203953944a08f41914175e89180
7
+ data.tar.gz: 3effd307d58a441330ef53c2b76377d41dac38552bf881e0c87d4f1d844acdf21fc9e1130945ffbb6a8d0389c8a921b59dfe453f4948741de552c405d25c40a6
data/README.md CHANGED
@@ -37,7 +37,7 @@ remote_theme: ELIXIR-Belgium/elixir-toolkit-theme
37
37
  You can lock it onto a specific version using:
38
38
 
39
39
  ```yaml
40
- remote_theme: ELIXIR-Belgium/elixir-toolkit-theme@4.1.0
40
+ remote_theme: ELIXIR-Belgium/elixir-toolkit-theme@5.0.0
41
41
  ```
42
42
 
43
43
  ### Using Ruby Gems (alternative)
@@ -50,7 +50,7 @@ gem "elixir-toolkit-theme"
50
50
  You can lock it onto a specific version like this:
51
51
 
52
52
  ```ruby
53
- gem "elixir-toolkit-theme", "~> 4.1.0"
53
+ gem "elixir-toolkit-theme", "~> 5.0.0"
54
54
  ```
55
55
 
56
56
  And add this line to your Jekyll site's `_config.yml`:
@@ -81,7 +81,7 @@ NOTE: This way of deploying does not support the tool-tag in the text of the mar
81
81
  Add an extra `.gitlab-ci.yml` file in the root of the repo with:
82
82
 
83
83
  ```yml
84
- image: ruby:2.7
84
+ image: ruby:3.3
85
85
 
86
86
  variables:
87
87
  JEKYLL_ENV: production
@@ -131,6 +131,7 @@ pages:
131
131
  ```
132
132
  JEKYLL_ENV=production PAGES_REPO_NWO='USER_OR_ORGANISATION/REPO_NAME' bundle exec jekyll serve --baseurl ""
133
133
  ```
134
+ Where `USER_OR_ORGANISATION/REPO_NAME` is the GitHub USER_OR_ORGANISATION/REPO_NAME (to be found in the url).
134
135
 
135
136
  1. To preview your site, in your web browser, navigate to `http://localhost:4000`.
136
137
 
@@ -169,6 +170,9 @@ This will start the docker container and serve the website locally. Make sure th
169
170
  - [FAIRDOM-SEEK Documentation](https://docs.seek4science.org/) (SEEK community)
170
171
  - [FAIR Lesson Plan Handbook](https://elixir-europe-training.github.io/ELIXIR-TrP-FAIR-Converge/) (ELIXIR Training platform)
171
172
  - [Data Steward Handbook](https://elixir-uk.github.io/elixir-ds-handbook) (ELIXIR RDM Community)
173
+ - [Fed-A-Crate](https://elixir-europe.github.io/fed-a-crate/how-to-contribute) (ELIXIR Fed-A-Crate project)
174
+ - [Federated Learning toolkit (FLkit)](https://uhasselt-biomedicaldatasciences.github.io/federated-learning-toolkit/) (UHasselt)
175
+ - [mTeSS-X](https://elixirtess.github.io/mTeSS-X/) (OSCARS project)
172
176
  - Want your instance here? [Open an issue](https://github.com/ELIXIR-Belgium/elixir-toolkit-theme/issues)
173
177
 
174
178
  ## Dependencies
@@ -1,3 +1,4 @@
1
+ {%- assign carousel_counter = carousel_counter | plus: 1 %}
1
2
  {%- assign contributors = site.data.CONTRIBUTORS %}
2
3
  {%- assign allcontrstr = nil %}
3
4
  {%- assign nr = include.col | default: 5 %}
@@ -39,7 +40,7 @@
39
40
  {%- assign allcontributors = allcontributors | sort %}
40
41
  {%- endunless %}
41
42
  {%- unless allcontributors.size == 0 %}
42
- <div id="contributors-carousel" class="carousel carousel-dark slide my-4" data-ride="carousel" data-bs-interval="7000">
43
+ <div id="contributors-carousel-{{carousel_counter}}" class="carousel carousel-dark slide my-4" data-ride="carousel" data-bs-interval="7000">
43
44
  <div class="carousel-inner">
44
45
  {%- assign counter = 0 %}
45
46
  {%- for contributor in allcontributors %}
@@ -111,11 +112,11 @@
111
112
  </div>
112
113
  {%- endif %}
113
114
  {%- endfor %}
114
- <button class="carousel-control-prev" type="button" data-bs-target="#contributors-carousel" data-bs-slide="prev">
115
+ <button class="carousel-control-prev" type="button" data-bs-target="#contributors-carousel-{{carousel_counter}}" data-bs-slide="prev">
115
116
  <span class="carousel-control-prev-icon" aria-hidden="true"></span>
116
117
  <span class="visually-hidden">Previous</span>
117
118
  </button>
118
- <button class="carousel-control-next" type="button" data-bs-target="#contributors-carousel" data-bs-slide="next">
119
+ <button class="carousel-control-next" type="button" data-bs-target="#contributors-carousel-{{carousel_counter}}" data-bs-slide="next">
119
120
  <span class="carousel-control-next-icon" aria-hidden="true"></span>
120
121
  <span class="visually-hidden">Next</span>
121
122
  </button>
@@ -1,8 +1,11 @@
1
- {%- if page.contributors and page.contributors.size != 0 %}
1
+ {%- assign EMPTY = "" | split: "" -%}
2
+ {%- assign contrib_list = page.contributors | default: EMPTY -%}
3
+ {%- assign coord_list = page.coordinators | default: EMPTY -%}
4
+ {%- if contrib_list.size > 0 or coord_list.size > 0 -%}
2
5
  <span class="d-block h2-like fs-2">{{site.theme_variables.contributor-minitiles-page | default: 'Contributors' }}</span>
3
6
  <div class="p-4 rounded mt-4 page-contributors d-flex flex-wrap gap-2">
4
7
  {%- assign contributors = site.data.CONTRIBUTORS %}
5
- {%- assign page_contributors = page.contributors %}
8
+ {%- assign page_contributors = contrib_list | concat: coord_list | uniq %}
6
9
  {%- unless include.sort == false %}
7
10
  {%- assign page_contributors = page_contributors | sort %}
8
11
  {%- endunless %}
@@ -35,9 +38,7 @@
35
38
  <div>
36
39
  {{ contributor }}
37
40
  </div>
38
- {%- if page.coordinators %}
39
- {%- for coordinator in page.coordinators %}
40
- {%- if coordinator == contributor %}
41
+ {%- if page.coordinators.size != 0 and page.coordinators contains contributor %}
41
42
  <div class="position-absolute top-0 start-100 translate-middle">
42
43
  <div class="rounded-circle coordinator-crown">
43
44
  <a data-bs-toggle="tooltip" data-bs-original-title="Coordinator of the {{page.title}} page.">
@@ -46,8 +47,6 @@
46
47
  </div>
47
48
  </div>
48
49
  {%- endif %}
49
- {%- endfor %}
50
- {%- endif %}
51
50
  </button>
52
51
  <div class="dropdown-menu shadow p-0 border-0 contributor-cards">
53
52
 
@@ -2,7 +2,7 @@
2
2
  {%- if include.title == true%}
3
3
  <h2>{{include.event_type | replace: "_", " " | capitalize}}s</h2>
4
4
  {%- endif %}
5
- {%- assign events = site.data.events %}
5
+ {%- assign events = site.data.events | sort: "startDate" | reverse %}
6
6
  {%- assign count = 0 %}
7
7
  <ul class="list-unstyled mt-3">
8
8
  {%- for event in events %}
@@ -1,5 +1,12 @@
1
+ {%- assign EMPTY = "" | split: "" %}
2
+ {%- assign footer_columns = site.data.footer.columns | default: EMPTY %}
3
+ {%- assign footer_copyright = site.data.footer.copyright %}
4
+ {%- assign footer_extra_line = site.data.footer.extra_line %}
5
+ {%- if footer_columns != EMPTY or footer_copyright or footer_extra_line %}
1
6
  <footer id="footer">
7
+ {%- if footer_columns != EMPTY or footer_extra_line %}
2
8
  <div class="container py-4 g-lg-5">
9
+ {%- if footer_columns != EMPTY %}
3
10
  <div class="row g-4 d-flex justify-content-between">
4
11
  {%- for column in site.data.footer.columns %}
5
12
  {%- if column.type == "image" %}
@@ -32,19 +39,21 @@
32
39
  {%- endif %}
33
40
  {%- endfor %}
34
41
  </div>
35
- {%- unless site.data.footer.extra_line == nil %}
42
+ {%- endif %}
43
+ {%- if footer_extra_line %}
36
44
  <div class="row">
37
45
  <div class="text-center pt-4 mb-0">
38
- {{site.data.footer.extra_line | markdownify }}
46
+ {{footer_extra_line | markdownify }}
39
47
  </div>
40
48
  </div>
41
- {%- endunless %}
49
+ {%- endif %}
42
50
  </div>
51
+ {%- endif %}
43
52
  <div class="copyright py-4">
44
53
  <div class="container g-lg-5 d-flex justify-content-between flex-column flex-lg-row">
45
- {%- unless site.data.footer.copyright == nil %}
46
- <div class="d-flex align-items-center mb-3 mb-lg-0 mx-auto mx-lg-0 text-center">{{ site.data.footer.copyright | markdownify }}</div>
47
- {%- endunless %}
54
+ {%- if footer_copyright %}
55
+ <div class="d-flex align-items-center mb-3 mb-lg-0 mx-auto mx-lg-0 text-center">{{ footer_copyright | markdownify }}</div>
56
+ {%- endif %}
48
57
  <div class="d-flex align-items-center mx-auto ms-lg-4 me-lg-0">
49
58
  <a id="ett-logo" class="text-nowrap me-lg-5 me-xxlg-0" href="https://elixir-belgium.github.io/elixir-toolkit-theme">Built with
50
59
  <svg data-name="ETT logo" xmlns="http://www.w3.org/2000/svg" width="30" height="30" viewBox="0 0 77.2 77.12">
@@ -72,3 +81,4 @@
72
81
  </div>
73
82
  </div>
74
83
  </footer>
84
+ {%- endif %}
@@ -1,20 +1,16 @@
1
1
  {%- assign show_github_edit_button = site.theme_variables.github_buttons.edit_me | default: true %}
2
2
  {%- assign show_github_history_button = site.theme_variables.github_buttons.history | default: true %}
3
3
  {%- assign show_github_open_issue_button = site.theme_variables.github_buttons.open_issue | default: true %}
4
-
5
4
  {%- if show_github_edit_button or show_github_history_button or show_github_open_issue_button %}
6
5
  <div id="edit-me" class="btn-group">
7
6
  {% if show_github_edit_button %}
8
- {% assign repo_url = page.custom_repo_url | default: site.github.repository_url %}
9
- {% if page.custom_editme %}
10
- {% assign file_path = page.custom_editme %}
11
- {% else %}
12
- {% assign file_path = page.custom_file_path | default: page.path %}
13
- {% endif %}
7
+ {% assign repo_url = page.github.repository_url | default: site.github.repository_url %}
8
+ {% assign repo_branch = page.github.branch | default: site.github.source.branch %}
9
+ {% assign file_path = page.github.file_path | default: page.path %}
14
10
  <a role="button" data-bs-toggle="tooltip"
15
11
  title="Propose changes to the content of this page on {{site.theme_variables.git_host | default: 'GitHub' }}"
16
- href="{{repo_url}}/blob/{{site.github.source.branch}}/{{file_path}}"
17
- class="btn btn-sm hover-primary text-primary"><i class="fa-solid fa-pencil-alt"></i></a>
12
+ href="{{repo_url}}/blob/{{repo_branch}}/{{file_path}}" class="btn btn-sm hover-primary text-primary"><i
13
+ class="fa-solid fa-pencil-alt"></i></a>
18
14
  {%- endif %}
19
15
  {%- if show_github_open_issue_button %}
20
16
  <a role="button" data-bs-toggle="tooltip" title="Report an issue"
@@ -23,8 +19,8 @@
23
19
  {%- endif %}
24
20
  {%- if show_github_history_button %}
25
21
  <a role="button" data-bs-toggle="tooltip" title="Check out the history of this page"
26
- href="{{repo_url}}/commits/{{site.github.source.branch}}/{{file_path}}"
27
- class="btn btn-sm hover-primary text-primary"><i class="fa-solid fa-history"></i></a>
22
+ href="{{repo_url}}/commits/{{repo_branch}}/{{file_path}}" class="btn btn-sm hover-primary text-primary"><i
23
+ class="fa-solid fa-history"></i></a>
28
24
  {%- endif %}
29
25
  </div>
30
26
  {%- endif %}
data/_includes/head.html CHANGED
@@ -1,38 +1,42 @@
1
+ {%- capture keywords %}
2
+ {%- if page.related_pages %}
3
+ {%- for section in page.related_pages %}
4
+ {%- unless section[1].size == 0 %}
5
+ {%- for keywordstr in section[1] %}
6
+ {%- assign keywordpage = site.pages | where: "page_id", keywordstr | first %}
7
+ {%- if allkeywords %}
8
+ {%- assign allkeywords = allkeywords | append: ", " | append: keywordstr | append: ", " | append: keywordpage.title %}
9
+ {%- else %}
10
+ {%- assign allkeywords = allkeywords | append: keywordstr | append: ", " | append: keywordpage.title %}
11
+ {%- endif %}
12
+ {%- endfor %}
13
+ {%- endunless %}
14
+ {%- endfor %}{{allkeywords}}
15
+ {%- endif %}
16
+ {%- endcapture %}
17
+ {%- if page.type %}
18
+ {%- assign subtitle = page.type | replace: "_", " " %}
19
+ {%- endif %}
20
+ {%- capture title %}{% if page.url == "/" %}{{site.title}}{% elsif page.title %}{% if subtitle %}{{subtitle}}: {% endif %}{{ page.title }} | {{ site.title }}{%- else %}{{ site.title }}{% endif %}{% endcapture %}
21
+ {%- capture description %}{% if page.url == "/" %}{{site.description}}{% elsif page.description %}{{ page.description | strip_html | replace: '\n', ' ' | truncatewords: 30, '...' }}{% elsif page.summary %}{{ page.summary | strip_html | replace: '\n', ' ' | truncatewords: 30, '...' }}{% else %}{{ page.content | strip_html | replace: '\n', ' ' | truncatewords: 30, '...' }}{% endif %}{% endcapture %}
1
22
  <head>
2
23
  <meta charset="utf-8">
3
24
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
25
+ <title>{{title}}</title>
4
26
  <meta name="viewport" content="width=device-width, initial-scale=1">
5
- <meta name="description" content="{% if page.description %}{{ page.description | strip_html | strip_newlines | truncate: 160 }}{% else %}{{ site.description }}{% endif %}">
6
- {%- capture keywords %}
7
- {%- if page.related_pages %}
8
- {%- for section in page.related_pages %}
9
- {%- unless section[1].size == 0 %}
10
- {%- for keywordstr in section[1] %}
11
- {%- assign keywordpage = site.pages | where: "page_id", keywordstr | first %}
12
- {%- if allkeywords %}
13
- {%- assign allkeywords = allkeywords | append: ", " | append: keywordstr | append: ", " | append: keywordpage.title %}
14
- {%- else %}
15
- {%- assign allkeywords = allkeywords | append: keywordstr | append: ", " | append: keywordpage.title %}
16
- {%- endif %}
17
- {%- endfor %}
18
- {%- endunless %}
19
- {%- endfor %}{{allkeywords}}
20
- {%- endif %}
21
- {%- endcapture %}
27
+ <meta name="description" content="{{description}}">
22
28
  <meta name="keywords" content="{{keywords}}">
23
- <meta property="og:title" content="{{ site.title }}" />
24
- <meta property="og:description" content="{{ site.description }}" />
29
+ <meta property="og:title" content="{{title}}" />
30
+ <meta property="og:description" content="{{description}}" />
31
+ <meta property="og:type" content="article">
32
+ <meta property="og:url" content="{{ page.url | absolute_url }}">
25
33
  <meta property="og:image" content="//{{site.github.url | remove: 'https://' | remove: 'http://'}}/assets/img/apple-touch-icon.png" />
26
- <meta name="apple-mobile-web-app-title" content="{{site.title}}">
34
+ <meta name="apple-mobile-web-app-title" content="{{title}}">
27
35
  <meta name="msapplication-TileColor" content="#{{site.theme_variables.theme_color | default: 0d6efd }}">
28
36
  <meta name="theme-color" content="#{{site.theme_variables.theme_color | default: 0d6efd }}">
29
37
  {%- if page.no_robots %}
30
38
  <meta name="robots" content="noindex" />
31
39
  {%- endif %}
32
- {%- if page.type %}
33
- {%- assign subtitle = page.type | replace: "_", " " | capitalize %}
34
- {%- endif %}
35
- <title>{% if page.title %}{% if subtitle %}{{subtitle}}: {% endif %}{{ page.title }} | {{ site.title }}{%- else %}{{ site.title }}{% endif %}</title>
36
40
  <!-- Syntax highlighting -->
37
41
  <link rel="stylesheet" href="{{ 'assets/css/syntax.css' | relative_url }}">
38
42
  <!-- Country flags -->
@@ -69,11 +73,12 @@
69
73
  <script type="text/javascript" charset="utf8" src="{{ 'assets/js/dataTables.dateTime.min.js' | relative_url }}"></script>
70
74
  <script type="text/javascript" charset="utf8" src="{{ 'assets/js/searchBuilder.bootstrap5.min.js' | relative_url }}"></script>
71
75
  {%- endif %}
76
+ {%- assign pagelength = site.theme_variables.datatables.pagelength | default: 10 %}
72
77
  <script type="text/javascript">
73
78
  $(document).ready(function () {
74
79
  $('table.display').each(function() {
75
80
  $(this).DataTable({
76
- lengthMenu: [[10, 25, 50, 100, -1], [10, 25, 50, 100, "All"]],
81
+ lengthMenu: [[{{ pagelength }}, {{ pagelength | times: 2 }}, {{ pagelength | times: 5 }}, {{ pagelength | times: 10 }}, -1], [{{ pagelength }}, {{ pagelength | times: 2 }}, {{ pagelength | times: 5 }}, {{ pagelength | times: 10 }}, "All"]],
77
82
  stateSave: true,
78
83
  searching: true,
79
84
  {%- if site.theme_variables.datatables.searchbuilder %}
@@ -82,13 +87,13 @@
82
87
  },
83
88
  {%- endif %}
84
89
  info: true,
85
- pageLength: 10,
90
+ pageLength: {{ pagelength }},
86
91
  language: {
87
92
  searchPlaceholder: "Type here..."
88
93
  },
89
94
  "drawCallback": function ( settings ){
90
95
  var tableId = settings.nTable.id;
91
- if(settings.fnRecordsTotal() < 10){
96
+ if(settings.fnRecordsTotal() < {{ pagelength }}){
92
97
  $('#'+tableId+'_wrapper .dt-length').hide();
93
98
  $('#'+tableId+'_wrapper .dt-paging').hide();
94
99
  $('#'+tableId+'_wrapper .dt-search').hide();
@@ -101,6 +106,7 @@
101
106
  });
102
107
  </script>
103
108
  {%- endif %}
109
+ <script src="{{ 'assets/js/custom.js' | relative_url }}?{{site.time | date: '%s'}}"></script>
104
110
  <!-- favicon -->
105
111
  <link rel="apple-touch-icon" sizes="180x180" href="{{ 'assets/img/apple-touch-icon.png' | relative_url }}">
106
112
  <link rel="icon" type="image/png" sizes="32x32" href="{{ 'assets/img/favicon-32x32.png' | relative_url }}">
data/_includes/news.html CHANGED
@@ -8,7 +8,7 @@
8
8
  {%- for new in news reversed%}
9
9
  <li>
10
10
  <span class="title mb-1">{{ new.name | escape }}</span>
11
- <p class="text-muted"><i class="far fa-calendar me-2"></i><time>{{ new.date | date_to_long_string }}</time>{% if new.linked_pr %} - <i class="fa-solid fa-code-branch me-2"></i><a href="{{ site.github.repository_url | append: '/pull/' | append: new.linked_pr }}">{{new.linked_pr }}</a>{% endif %}</p>
11
+ <p class="text-muted"><i class="far fa-calendar me-2"></i><time>{{ new.date | date_to_long_string }}</time>{% if new.linked_pr %} - <i class="fa-solid fa-code-branch me-2"></i><a href="{{ site.github.repository_url | append: '/pull/' | append: new.linked_pr }}"><span>{{new.linked_pr }}</span></a>{% endif %}</p>
12
12
  {%- if new.description %}
13
13
  {%- assign word_count = new.description | split: " " | size %}
14
14
  {%- if include.truncate == true and word_count > 40 %}
@@ -1,6 +1,6 @@
1
1
  {%- assign sidebar = site.data.sidebars[include.sidebar]['subitems'] -%}
2
2
  {%- for sections in sidebar %}
3
- {%- assign section = sections.title | downcase | replace: " ", "_" %}
3
+ {%- assign section = sections.title | replace: " ", "_" %}
4
4
  {%- assign section_pages = site.pages | where:"type", section | where_exp: "item", "item.search_exclude != true" | where_exp: "item", "item.page_id != nil" %}
5
5
  {%- unless section_pages.size == 0 %}
6
6
  <h2>{{sections.title}}</h2>
@@ -23,7 +23,7 @@
23
23
  <img src="{{page_hit.type_img | relative_url}}" class="type-icon me-2" alt="{{page_hit.type}} icon">
24
24
  {%- endif %}
25
25
  {%- if page_hit.type %}
26
- <span class=""><small>{{page_hit.type | replace: "_", " " | capitalize }}</small></span>
26
+ <span class=""><small>{{page_hit.type | replace: "_", " " }}</small></span>
27
27
  {%- endif %}
28
28
  </div>
29
29
  <a class="stretched-link section-title" aria-label="Go to the {{page_hit.title}} page" href="{{ page_hit.url | relative_url }}">
@@ -92,7 +92,7 @@
92
92
  {%- for tag in tool.related_pages %}
93
93
  {%- unless tag == page.page_id %}
94
94
  {%- assign related_page = site.pages | where:"page_id",tag | first %}
95
- <a href="{{related_page.url | relative_url }}" data-bs-toggle="tooltip" title="{{related_page.type | replace: '_', ' ' | capitalize }}"><span class="badge default-badge">{{ related_page.title | truncate: 25 }}</span></a>
95
+ <a href="{{related_page.url | relative_url }}" data-bs-toggle="tooltip" title="{{related_page.type | replace: '_', ' ' }}"><span class="badge default-badge">{{ related_page.title | truncate: 25 }}</span></a>
96
96
  {%- endunless %}
97
97
  {%- endfor %}
98
98
  {%- endcapture %}
@@ -47,7 +47,7 @@
47
47
  {%- for tag in section[1] %}
48
48
  {%- unless tag == page.page_id %}
49
49
  {%- assign related_page = site.pages | where:"page_id",tag | first %}
50
- <a class="nohover" href="{{related_page.url | relative_url }}" data-bs-toggle="tooltip" title="{{related_page.type | replace: '_', ' ' | capitalize}}"><span class="badge default-badge">{{ related_page.title | truncate: 25 }}</span></a>
50
+ <a class="nohover" href="{{related_page.url | relative_url }}" data-bs-toggle="tooltip" title="{{related_page.type | replace: '_', ' ' }}"><span class="badge default-badge">{{ related_page.title | truncate: 25 }}</span></a>
51
51
  {%- endunless %}
52
52
  {%- endfor %}
53
53
  {%- endunless %}
@@ -126,7 +126,7 @@
126
126
  {%- for tag in tool.related_pages %}
127
127
  {%- unless tag == page.page_id %}
128
128
  {%- assign related_page = site.pages | where:"page_id",tag | first %}
129
- <a href="{{related_page.url | relative_url }}" data-bs-toggle="tooltip" title="{{related_page.type | replace: '_', ' ' | capitalize}}"><span class="badge default-badge">{{ related_page.title | truncate: 25 }}</span></a>
129
+ <a href="{{related_page.url | relative_url }}" data-bs-toggle="tooltip" title="{{related_page.type | replace: '_', ' ' }}"><span class="badge default-badge">{{ related_page.title | truncate: 25 }}</span></a>
130
130
  {%- endunless %}
131
131
  {%- endfor %}
132
132
  {%- endcapture %}
@@ -37,7 +37,7 @@
37
37
  <div class="col">
38
38
  <div class="input-group">
39
39
  <span class="input-group-text" id="search-label-tiles"><i class="fa-solid fa-magnifying-glass"></i></span>
40
- <input type="text" id="title-search" class="form-control" onkeyup="StartSearch();" placeholder="Find your page..." aria-label="{{page.type | replace: '_', ' ' |}}" aria-describedby="search-label-tiles">
40
+ <input type="text" id="title-search" class="form-control" onkeyup="StartSearch();" placeholder="Find your page..." aria-label="{{page.type | replace: '_', ' ' }}" aria-describedby="search-label-tiles">
41
41
  <button class="btn btn-primary" title="Button to clear search" type="button" id="clearsearch">
42
42
  <i class="fa-solid fa-backspace"></i>
43
43
  </button>
@@ -90,7 +90,7 @@
90
90
  <img src="{{current_page.type_img | relative_url}}" class="type-icon me-2" alt="{{current_page.type}} icon">
91
91
  {%- endif %}
92
92
  {%- if current_page.type %}
93
- <span class=""><small>{{current_page.type | replace: "_", " " | capitalize }}</small></span>
93
+ <span class=""><small>{{current_page.type | replace: "_", " " }}</small></span>
94
94
  {%- endif %}
95
95
  </div>
96
96
  <a class="stretched-link section-title" aria-label="Go to the {{current_page.title}} page" href="{{ current_page.url | relative_url }}">
data/_layouts/page.html CHANGED
@@ -8,7 +8,7 @@ layout: default
8
8
  {%- endif %}
9
9
  {%- if page.title %}
10
10
  {%- if page.type and site.theme_variables.breadcrumb != true %}
11
- {%- assign subtitle = page.type | replace: "_", " " | capitalize %}
11
+ {%- assign subtitle = page.type | replace: "_", " " %}
12
12
  <h1 class="has-subtitle order-1 order-md-0"><span class="d-block text-secondary fs-4 ff-body">{{subtitle}}</span><span class="visually-hidden">:</span> {{ page.title }}
13
13
  {%- else %}
14
14
  <h1>{{ page.title }}
data/assets/css/main.scss CHANGED
@@ -98,33 +98,34 @@ body img {
98
98
  font-family: $font-family-theme !important;
99
99
  }
100
100
 
101
+ // Add external link icon to all urls
102
+ #content a:is([href^="http"], [href^="//"]):not([href^="{{ site.url }}"]):not([href^="mailto:"]):not([href^="tel:"]):not(:has(> span:only-child)):not(:has(> img)):not(.btn):not(.no-ext-icon)::after {
103
+ content: "\f35d";
104
+ font-family: "Font Awesome 6 Free";
105
+ font-weight: 900;
106
+ display: inline-block;
107
+ margin-left: .4em;
108
+ font-size: .60em;
109
+ line-height: 1;
110
+ text-rendering: auto;
111
+ -webkit-font-smoothing: antialiased;
112
+ -moz-osx-font-smoothing: grayscale;
113
+ pointer-events: none;
114
+ vertical-align: middle;
115
+ }
116
+
101
117
  /*-----Layout-----*/
102
118
 
103
119
  #main {
104
120
  grid-area: main;
105
121
  }
106
122
 
107
- @include media-breakpoint-up(md) {
108
- #main {
109
- display: grid;
110
- grid-template-areas:
111
- "intro"
112
- "toc"
113
- "content";
114
- grid-template-rows: auto auto 1fr;
115
- }
123
+ #intro {
124
+ grid-area: intro;
116
125
  }
117
- @include media-breakpoint-up(xl) {
118
- #main {
119
- grid-template-areas:
120
- "intro toc"
121
- "content toc";
122
- grid-template-rows: auto 1fr;
123
- }
124
126
 
125
- .add-grid {
126
- grid-template-columns: 5fr 2fr;
127
- }
127
+ #sidebar {
128
+ grid-area: sidebar;
128
129
  }
129
130
 
130
131
  #toc {
@@ -141,8 +142,36 @@ body img {
141
142
  }
142
143
  }
143
144
 
145
+ @include media-breakpoint-up(md) {
146
+ #main {
147
+ display: grid;
148
+ grid-template-areas:
149
+ "intro"
150
+ "toc"
151
+ "content";
152
+ grid-template-rows: auto auto 1fr;
153
+ }
154
+ }
155
+
156
+
157
+ @include media-breakpoint-up(lg) {
158
+ #layout {
159
+ display: grid;
160
+ grid-template-areas: "sidebar main";
161
+ grid-template-columns: 3fr 9fr;
162
+ }
163
+ }
164
+
144
165
  @include media-breakpoint-up(xl) {
145
- #toc {
166
+ #main.add-grid {
167
+ grid-template-areas:
168
+ "intro toc"
169
+ "content toc";
170
+ grid-template-rows: auto 1fr;
171
+ grid-template-columns: 5fr 2fr;
172
+ }
173
+
174
+ #main.add-grid #toc {
146
175
  top: $spacer * 3;
147
176
  right: 0;
148
177
  z-index: 2;
@@ -150,15 +179,12 @@ body img {
150
179
  overflow-y: auto;
151
180
  margin-left: $spacer * 3;
152
181
  }
153
- }
154
182
 
155
- #intro {
156
- grid-area: intro;
183
+ #layout {
184
+ grid-template-columns: 2fr 9fr;
185
+ }
157
186
  }
158
187
 
159
- #sidebar {
160
- grid-area: sidebar;
161
- }
162
188
 
163
189
  #content {
164
190
  grid-area: content;
@@ -169,19 +195,6 @@ body img {
169
195
  }
170
196
  }
171
197
 
172
- @include media-breakpoint-up(lg) {
173
- #layout {
174
- display: grid;
175
- grid-template-areas: "sidebar main";
176
- grid-template-columns: 3fr 9fr;
177
- }
178
- }
179
-
180
- @include media-breakpoint-up(xl) {
181
- #layout {
182
- grid-template-columns: 2fr 9fr;
183
- }
184
- }
185
198
 
186
199
  /*-----Blockquote-----*/
187
200
 
File without changes
data/assets/js/toc.js CHANGED
@@ -5,85 +5,114 @@
5
5
  title: '<i>Jump to...</i>',
6
6
  minimumHeaders: 3,
7
7
  headers: 'h1, h2, h3, h4, h5, h6',
8
- listType: 'ol', // values: [ol|ul]
9
- showEffect: 'show', // values: [show|slideDown|fadeIn|none]
10
- showSpeed: 'slow', // set to 0 to deactivate effect
8
+ listType: 'ol', // values: [ol|ul]
9
+ showEffect: 'show', // values: [show|slideDown|fadeIn|none]
10
+ showSpeed: 'slow', // set to 0 to deactivate effect
11
11
  classes: {
12
12
  list: '',
13
13
  item: '',
14
14
  link: '',
15
15
  toc: ''
16
16
  }
17
- },
18
- settings = $.extend(defaults, options);
17
+ };
18
+
19
+ // Do not mutate defaults; merge into a fresh object
20
+ var settings = $.extend({}, defaults, options);
19
21
 
22
+ // Encode fragment identifiers safely (e.g., handle !'()*)
20
23
  function fixedEncodeURIComponent(str) {
21
24
  return encodeURIComponent(str).replace(/[!'()*]/g, function (c) {
22
25
  return '%' + c.charCodeAt(0).toString(16);
23
26
  });
24
27
  }
25
28
 
29
+ // Build an <a> for a given header; ensure it has an id
26
30
  function createLink(header) {
27
- var innerText = header.textContent || header.innerText;
28
- return "<a class='" + settings.classes.link + "' href='#" + fixedEncodeURIComponent(header.id) + "'>" + innerText + "</a>";
31
+ var innerText = header.textContent || header.innerText || '';
32
+ if (!header.id) {
33
+ header.id = innerText.trim()
34
+ ? innerText.trim().replace(/\s+/g, '-').toLowerCase()
35
+ : ('heading-' + Math.random().toString(36).slice(2, 8)); // fallback id
36
+ }
37
+ return "<a class='" + settings.classes.link + "' href='#" +
38
+ fixedEncodeURIComponent(header.id) + "'>" + innerText + "</a>";
29
39
  }
30
40
 
41
+ // Collect headers and ensure they have IDs (filter out those that still don't)
31
42
  var headers = $(settings.headers).filter(function () {
32
- // Ensure headers have IDs
33
43
  if (!this.id) {
34
- this.id = $(this).text().trim().replace(/\s+/g, '-').toLowerCase();
44
+ var text = $(this).text().trim();
45
+ this.id = text ? text.replace(/\s+/g, '-').toLowerCase() : '';
35
46
  }
36
47
  return this.id;
37
48
  });
38
49
 
39
- var output = $(this);
50
+ var output = $(this); // the TOC container (e.g., #toc-contents)
51
+ var $main = $('#main');
40
52
 
41
- // Check if there are any headers
42
- if (!$('#page-img .page-img-lg').length ) {
43
- if ( !headers.length || headers.length < settings.minimumHeaders || !output.length ) {
44
- $('#main').removeClass("add-grid");
45
- $("#toc").hide();
46
- return; // Exit early if there are no headers
47
- }
53
+ // Prevents calling get_level(headers[0]) on undefined and collapses layout/space.
54
+ if (!headers.length || headers.length < settings.minimumHeaders || !output.length) {
55
+ $main.removeClass('add-grid'); // collapse layout (your existing side-effect + our flag)
56
+ output.empty().hide(); // hide/clear inner TOC container
57
+ return;
48
58
  }
49
59
 
50
- if (settings.showSpeed === 0) {
51
- settings.showEffect = 'none';
52
- }
60
+ // If speed is 0, disable visual effect
61
+ if (settings.showSpeed === 0) settings.showEffect = 'none';
53
62
 
54
- $(this).addClass(settings.classes.toc);
63
+ // Optional extra class on the container
64
+ output.addClass(settings.classes.toc);
55
65
 
56
66
  var render = {
57
- show: function () { output.hide().html(html).show(settings.showSpeed); },
67
+ show: function () { output.hide().html(html).show(settings.showSpeed); },
58
68
  slideDown: function () { output.hide().html(html).slideDown(settings.showSpeed); },
59
- fadeIn: function () { output.hide().html(html).fadeIn(settings.showSpeed); },
60
- none: function () { output.html(html); }
69
+ fadeIn: function () { output.hide().html(html).fadeIn(settings.showSpeed); },
70
+ none: function () { output.html(html); }
71
+ };
72
+
73
+ // Resilient parser of header levels (H1..H6 → 1..6). Returns NaN if invalid.
74
+ var get_level = function (ele) {
75
+ return (ele && ele.nodeName) ? parseInt(ele.nodeName.replace(/H/i, ''), 10) : NaN;
61
76
  };
62
77
 
63
- var get_level = function (ele) { return parseInt(ele.nodeName.replace("H", ""), 10); };
64
- var highest_level = headers.map(function (_, ele) { return get_level(ele); }).get().sort()[0];
65
- var level = get_level(headers[0]), this_level;
78
+ // Validate first level before proceeding
79
+ var level = get_level(headers[0]);
80
+ if (!isFinite(level)) {
81
+ output.hide().empty();
82
+ return;
83
+ }
84
+
85
+ var this_level;
66
86
  var html = settings.title + " <" + settings.listType + " class=\"" + settings.classes.list + "\">";
67
87
 
88
+ // Build nested list based on header levels
68
89
  headers.each(function (_, header) {
69
90
  this_level = get_level(header);
70
- if (this_level === level) { // same level as before; same indenting
91
+ if (!isFinite(this_level)) return; // skip anything unexpected
92
+
93
+ if (this_level === level) { // same level; same indent
71
94
  html += "<li class=\"" + settings.classes.item + "\">" + createLink(header);
72
- } else if (this_level <= level) { // higher level than before; end parent ol
95
+ } else if (this_level <= level) { // moving up; close lists
73
96
  for (var i = this_level; i < level; i++) {
74
- html += "</li></" + settings.listType + ">"
97
+ html += "</li></" + settings.listType + ">";
75
98
  }
76
99
  html += "<li class=\"" + settings.classes.item + "\">" + createLink(header);
77
- } else if (this_level > level) { // lower level than before; expand the previous to contain a ol
78
- for (i = this_level; i > level; i--) {
100
+ } else { // moving down; open nested lists
101
+ for (var j = this_level; j > level; j--) {
79
102
  html += "<" + settings.listType + " class=\"" + settings.classes.list + "\">" +
80
- "<li class=\"" + settings.classes.item + "\">"
103
+ "<li class=\"" + settings.classes.item + "\">";
81
104
  }
82
105
  html += createLink(header);
83
106
  }
84
- level = this_level; // update for the next one
107
+ level = this_level; // update for next header
85
108
  });
109
+
86
110
  html += "</" + settings.listType + ">";
87
- render[settings.showEffect]();
111
+
112
+ // Render with the selected effect
113
+ (render[settings.showEffect] || render.none)();
114
+
115
+ // Add grid + flag on #main (if your layout uses it), and flag #toc so CSS applies margin.
116
+ $main.addClass('add-grid');
88
117
  };
89
118
  })(jQuery);
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: elixir-toolkit-theme
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.2.0
4
+ version: 5.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - bedroesb
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-03-18 00:00:00.000000000 Z
11
+ date: 2025-08-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jekyll
@@ -503,6 +503,7 @@ files:
503
503
  - assets/js/bootstrap.bundle.min.js
504
504
  - assets/js/bootstrap.bundle.min.js.map
505
505
  - assets/js/clipboard.min.js
506
+ - assets/js/custom.js
506
507
  - assets/js/dataTables.bootstrap5.min.js
507
508
  - assets/js/dataTables.dateTime.min.js
508
509
  - assets/js/dataTables.searchBuilder.min.js