jekyll-theme-centos 2.52.0.beta.89 → 2.52.0.beta.90

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 (103) hide show
  1. checksums.yaml +4 -4
  2. data/_data/base/download.yml +23 -0
  3. data/_data/base/download_schema.yml +254 -0
  4. data/_data/base/navbar_schema.yml +6 -6
  5. data/_data/base/navindex_schema.yml +1 -1
  6. data/_data/base/sponsors.yml +0 -1
  7. data/_data/base/sponsors_schema.yml +13 -4
  8. data/_data/base/title_schema.yml +3 -1
  9. data/_includes/base/download.html.liquid +146 -0
  10. data/_includes/base/download_accordion_item.html.liquid +39 -0
  11. data/_includes/base/download_architecture.html.liquid +240 -0
  12. data/_includes/base/download_commands.html.liquid +27 -0
  13. data/_includes/base/download_documentation.html.liquid +24 -0
  14. data/_includes/base/download_eol.html.liquid +29 -0
  15. data/_includes/base/download_filevalue.html.liquid +68 -0
  16. data/_includes/base/download_screenshots.html.liquid +79 -0
  17. data/_includes/base/download_sections.html.liquid +51 -0
  18. data/_includes/base/navindex.html.liquid +7 -5
  19. data/_includes/base/sponsors-cards.html.liquid +1 -1
  20. data/_includes/base/sponsors-carousel.html.liquid +1 -1
  21. data/_includes/base/title.html.liquid +6 -1
  22. data/_sass/base/_download.scss +70 -0
  23. data/_sass/base/_variables.scss +7 -0
  24. data/assets/css/base/stylesheet.min.scss +1 -0
  25. data/assets/js/base/datatable.js +7 -2
  26. data/assets/js/base/highlight.js +1 -1
  27. metadata +13 -77
  28. data/_data/download/cards.yml +0 -309
  29. data/_data/download/navbar.yml +0 -11
  30. data/_includes/download/cards-body-commands.html +0 -7
  31. data/_includes/download/cards-body-convert.html +0 -10
  32. data/_includes/download/cards-body-doc.html +0 -9
  33. data/_includes/download/cards-body-documentation.html +0 -11
  34. data/_includes/download/cards-body-eol.html +0 -16
  35. data/_includes/download/cards-body-mirrors.html +0 -8
  36. data/_includes/download/cards-body-screenshot.html +0 -26
  37. data/_includes/download/cards-body-screenshots.html +0 -32
  38. data/_includes/download/cards-body.html +0 -8
  39. data/_includes/download/cards-footer.html +0 -3
  40. data/_includes/download/cards-header-commands.html +0 -8
  41. data/_includes/download/cards-header-convert.html +0 -8
  42. data/_includes/download/cards-header-doc.html +0 -8
  43. data/_includes/download/cards-header-documentation.html +0 -8
  44. data/_includes/download/cards-header-eol.html +0 -8
  45. data/_includes/download/cards-header-mirrors.html +0 -13
  46. data/_includes/download/cards-header-screenshot.html +0 -8
  47. data/_includes/download/cards-header-screenshots.html +0 -8
  48. data/_includes/download/cards-header.html +0 -13
  49. data/_includes/download/cards.html +0 -120
  50. data/_layouts/download/cards.html +0 -7
  51. data/_layouts/download/default.html +0 -7
  52. data/assets/img/base/centos-colors.gpl +0 -55
  53. data/assets/img/base/example-ogp-image.svg +0 -297
  54. data/assets/img/base/example-sponsors-design.svg +0 -226
  55. data/assets/img/base/example-sponsors-logo-1.svg +0 -120
  56. data/assets/img/base/example-sponsors-logo-2.svg +0 -116
  57. data/assets/img/base/example-sponsors-logo-3.svg +0 -123
  58. data/assets/img/base/example-sponsors-logo-4.svg +0 -116
  59. data/assets/img/base/example-sponsors-logo-5.svg +0 -116
  60. data/assets/img/base/example-sponsors-logo-6.svg +0 -116
  61. data/assets/img/base/example-sponsors-logo-7.svg +0 -116
  62. data/assets/img/base/example-sponsors-logo-8.svg +0 -110
  63. data/assets/img/base/page-layout-default.svg +0 -1196
  64. data/assets/img/base/page-with-alert.svg +0 -438
  65. data/assets/img/base/page-with-announcement.svg +0 -441
  66. data/assets/img/base/page-with-artwork.svg +0 -384
  67. data/assets/img/base/page-with-backtotop.svg +0 -502
  68. data/assets/img/base/page-with-bits.svg +0 -377
  69. data/assets/img/base/page-with-breadcrumb.svg +0 -354
  70. data/assets/img/base/page-with-breakingnews.svg +0 -433
  71. data/assets/img/base/page-with-calendar.svg +0 -57
  72. data/assets/img/base/page-with-color.svg +0 -57
  73. data/assets/img/base/page-with-copyright.svg +0 -506
  74. data/assets/img/base/page-with-copyvalue.svg +0 -57
  75. data/assets/img/base/page-with-datatable.svg +0 -57
  76. data/assets/img/base/page-with-event.svg +0 -448
  77. data/assets/img/base/page-with-fontawesome.svg +0 -147
  78. data/assets/img/base/page-with-footer.svg +0 -506
  79. data/assets/img/base/page-with-heading.svg +0 -57
  80. data/assets/img/base/page-with-highlight.svg +0 -86
  81. data/assets/img/base/page-with-image.svg +0 -57
  82. data/assets/img/base/page-with-link.svg +0 -57
  83. data/assets/img/base/page-with-locales.svg +0 -502
  84. data/assets/img/base/page-with-navbar.svg +0 -1060
  85. data/assets/img/base/page-with-navindex.svg +0 -279
  86. data/assets/img/base/page-with-ogp.svg +0 -401
  87. data/assets/img/base/page-with-project.svg +0 -853
  88. data/assets/img/base/page-with-shortcut.svg +0 -502
  89. data/assets/img/base/page-with-social.svg +0 -502
  90. data/assets/img/base/page-with-sponsors.svg +0 -502
  91. data/assets/img/base/page-with-title.svg +0 -324
  92. data/assets/img/base/page-with-toc.svg +0 -324
  93. data/assets/img/base/screenshot-1200x600.svg +0 -114
  94. data/assets/img/download/centos-linux-7-2009-screenshot-n.png +0 -0
  95. data/assets/img/download/centos-stream-8-screenshot-n.png +0 -0
  96. data/assets/img/download/centos-stream-9-screenshot-n.png +0 -0
  97. data/assets/img/download/distribution-release-screenshot-1.png +0 -0
  98. data/assets/img/download/distribution-release-screenshot-2.png +0 -0
  99. data/assets/img/download/distribution-release-screenshot-3.png +0 -0
  100. data/assets/img/download/distribution-release-screenshot-n.png +0 -0
  101. data/assets/img/download/distribution-release-screenshot-n.svg +0 -134
  102. data/assets/img/download/download.svg +0 -421
  103. data/assets/img/download/fig-the-downloads-cards-presentation-template.png +0 -0
@@ -0,0 +1,240 @@
1
+ {% comment %}
2
+ ================================================================================
3
+ Utility: Download Architecture Grid
4
+ Purpose: One box per architecture, each with that architecture's own main
5
+ download/checksum/signature and mirror links — the single per-architecture
6
+ data source for a release. Called from download_sections.html.liquid.
7
+
8
+ Required Inputs:
9
+ - architecture: Map of architecture label (e.g. `x86_64`) to
10
+ {download, checksum, signature, checksum_value, signature_value,
11
+ mirrors: {iso, rpm, cloud, containers, vagrant, torrent}} — see
12
+ download_schema.yml for the full field-by-field description.
13
+ - release_id: The parent release's unique id, combined with each
14
+ architecture's own label to build a page-unique id_prefix for the
15
+ checksum/signature rows — see download_filevalue.html.liquid's id_prefix
16
+ note for why that's needed.
17
+
18
+ Within each box: icon + architecture title, then (if present) a Download
19
+ button, then (if present) one input-group row each for checksum and
20
+ signature, then (if present) the outline-primary mirror buttons — mirrors
21
+ is always the last section, so it never carries a trailing rule.
22
+
23
+ Design rationale for specific decisions lives as inline comments next to the
24
+ code they explain: the architecture map's shape versus mirrors/flavors
25
+ (above the grid loop below), the Download button's layout (above its
26
+ markup), the checksum/signature row design (above the download_filevalue
27
+ includes), and the responsive column/divider/orphan-row grid math (above
28
+ the column-count and orphan-detection blocks immediately below).
29
+ ================================================================================
30
+ {% endcomment %}
31
+
32
+ {%- comment %} Column count tracks item count (capped at 4) so the grid always
33
+ fills the row width, instead of a fixed row-cols-md-3 leaving a gap when there
34
+ are only 1 or 2 architectures. {% endcomment %}
35
+ {%- assign arch_count = include.architecture.size -%}
36
+ {%- case arch_count -%}
37
+ {%- when 1 -%}{%- assign arch_cols = 1 -%}
38
+ {%- when 2 -%}{%- assign arch_cols = 2 -%}
39
+ {%- when 3 -%}{%- assign arch_cols = 3 -%}
40
+ {%- else -%}{%- assign arch_cols = 4 -%}
41
+ {%- endcase -%}
42
+
43
+ {%- comment %} Orphan-row detection: for each breakpoint's column count,
44
+ figure out whether arch_count leaves a trailing partial row, and if so, the
45
+ 0-based index where that partial row starts (orphan_*_start) and the width
46
+ each of its boxes should stretch to (orphan_*_width = 100% / remainder). A
47
+ value of -1 means "no orphan row at this breakpoint" — every box divides
48
+ evenly, or this breakpoint isn't reached at all (arch_cols too low).
49
+ {% endcomment %}
50
+ {%- assign row_cols_classes = "row-cols-1" -%}
51
+ {%- assign arch_divider_class = "" -%}
52
+ {%- assign orphan_sm_start = -1 -%}
53
+ {%- assign orphan_sm_width = "" -%}
54
+ {%- assign orphan_md_start = -1 -%}
55
+ {%- assign orphan_md_width = "" -%}
56
+ {%- assign orphan_lg_start = -1 -%}
57
+ {%- assign orphan_lg_width = "" -%}
58
+
59
+ {%- comment %} Steps up one column per breakpoint (1 → sm:2 → md:3 → lg:4)
60
+ instead of jumping straight from 1 to arch_cols at a single breakpoint, so
61
+ stretching the window grows the grid progressively rather than in one hard
62
+ jump. Capped at arch_cols throughout — a 2-architecture release stops
63
+ adding columns at sm and never reaches 3 or 4, so it doesn't leave empty
64
+ gaps at wider viewports. {% endcomment %}
65
+ {%- if arch_cols >= 2 -%}
66
+ {%- assign row_cols_classes = row_cols_classes | append: " row-cols-sm-2" -%}
67
+ {%- assign arch_divider_class = "download-arch-divider-sm" -%}
68
+ {%- assign remainder = arch_count | modulo: 2 -%}
69
+ {%- if remainder != 0 -%}
70
+ {%- assign orphan_sm_start = arch_count | minus: remainder -%}
71
+ {%- assign orphan_sm_width = "100%" -%}
72
+ {%- endif -%}
73
+ {%- endif -%}
74
+
75
+ {%- if arch_cols >= 3 -%}
76
+ {%- assign row_cols_classes = row_cols_classes | append: " row-cols-md-3" -%}
77
+ {%- assign arch_divider_class = "download-arch-divider-md" -%}
78
+ {%- assign remainder = arch_count | modulo: 3 -%}
79
+ {%- if remainder != 0 -%}
80
+ {%- assign orphan_md_start = arch_count | minus: remainder -%}
81
+ {%- case remainder -%}
82
+ {%- when 1 -%}{%- assign orphan_md_width = "100%" -%}
83
+ {%- else -%}{%- assign orphan_md_width = "50%" -%}
84
+ {%- endcase -%}
85
+ {%- endif -%}
86
+ {%- endif -%}
87
+
88
+ {%- if arch_cols >= 4 -%}
89
+ {%- assign row_cols_classes = row_cols_classes | append: " row-cols-lg-4" -%}
90
+ {%- assign arch_divider_class = "download-arch-divider-lg" -%}
91
+ {%- assign remainder = arch_count | modulo: 4 -%}
92
+ {%- if remainder != 0 -%}
93
+ {%- assign orphan_lg_start = arch_count | minus: remainder -%}
94
+ {%- case remainder -%}
95
+ {%- when 1 -%}{%- assign orphan_lg_width = "100%" -%}
96
+ {%- when 2 -%}{%- assign orphan_lg_width = "50%" -%}
97
+ {%- else -%}{%- assign orphan_lg_width = "33.33333333%" -%}
98
+ {%- endcase -%}
99
+ {%- endif -%}
100
+ {%- endif -%}
101
+
102
+ {%- comment %} Each architecture owns its own download/checksum/signature/
103
+ mirrors row directly in the architecture map, replacing an older separate
104
+ mirrors array (which carried its own `architecture` field per row and could
105
+ drift out of sync with itself across rows). Alternative images (flavors,
106
+ e.g. a desktop spin) are deliberately NOT part of this grid — a flavor is
107
+ just another download entry, not a smaller variant of this one; model it as
108
+ its own with_download_data entry instead (releases keyed by flavor name
109
+ reuse the tab selector) and link the two via `documentation` or page
110
+ content — see examples/components/download-alternative-images.md.
111
+ {% endcomment %}
112
+ <div class="row {{ row_cols_classes }} g-3 align-items-start">
113
+ {%- for arch in include.architecture %}
114
+ {%- assign arch_name = arch[0] %}
115
+ {%- assign arch_data = arch[1] %}
116
+ {%- comment %} Each box beyond the first in its row gets the divider
117
+ class for the breakpoint the grid has reached (arch_divider_class, set
118
+ above per breakpoint) — a border-left shown only once the grid reaches
119
+ its full arch_cols width, not at every intermediate step. That's
120
+ deliberate: forloop.index0 modulo arch_cols only identifies "first in
121
+ its row" correctly once the grid is actually arch_cols-wide, so dividers
122
+ are hidden during the narrower intermediate steps rather than risk
123
+ misplaced lines while the grid is still at 2 or 3 columns. A box that
124
+ starts a wrapped second row (5+ architectures) correctly gets no divider
125
+ either, same as the very first box overall. {% endcomment %}
126
+ {%- assign arch_row_position = forloop.index0 | modulo: arch_cols %}
127
+ {%- assign arch_col_class = "col" %}
128
+ {%- unless arch_row_position == 0 %}
129
+ {%- assign arch_col_class = "col " | append: arch_divider_class %}
130
+ {%- endunless %}
131
+
132
+ {%- assign arch_orphan_style = "" -%}
133
+ {%- if orphan_sm_start >= 0 and forloop.index0 >= orphan_sm_start -%}
134
+ {%- assign arch_col_class = arch_col_class | append: " download-arch-orphan-sm" -%}
135
+ {%- assign arch_orphan_style = arch_orphan_style | append: "--download-arch-orphan-sm-width: " | append: orphan_sm_width | append: ";" -%}
136
+ {%- endif -%}
137
+ {%- if orphan_md_start >= 0 and forloop.index0 >= orphan_md_start -%}
138
+ {%- assign arch_col_class = arch_col_class | append: " download-arch-orphan-md" -%}
139
+ {%- assign arch_orphan_style = arch_orphan_style | append: "--download-arch-orphan-md-width: " | append: orphan_md_width | append: ";" -%}
140
+ {%- endif -%}
141
+ {%- if orphan_lg_start >= 0 and forloop.index0 >= orphan_lg_start -%}
142
+ {%- assign arch_col_class = arch_col_class | append: " download-arch-orphan-lg" -%}
143
+ {%- assign arch_orphan_style = arch_orphan_style | append: "--download-arch-orphan-lg-width: " | append: orphan_lg_width | append: ";" -%}
144
+ {%- endif -%}
145
+
146
+ {%- assign has_mirrors = false %}
147
+ {%- if arch_data.mirrors.iso and arch_data.mirrors.iso != "" or arch_data.mirrors.rpm and arch_data.mirrors.rpm != "" or arch_data.mirrors.cloud and arch_data.mirrors.cloud != "" or arch_data.mirrors.containers and arch_data.mirrors.containers != "" or arch_data.mirrors.vagrant and arch_data.mirrors.vagrant != "" or arch_data.mirrors.torrent and arch_data.mirrors.torrent != "" %}
148
+ {%- assign has_mirrors = true %}
149
+ {%- endif %}
150
+ {%- comment %} arch_name is a raw YAML map key — strip the same
151
+ attribute/markup-breaking characters entry_title_id_safe strips in
152
+ download.html.liquid before it seeds arch_id_prefix, which in turn
153
+ becomes id/data-copy-value scoping in download_filevalue.html.liquid. {% endcomment %}
154
+ {%- assign arch_name_id_safe = arch_name | remove: '"' | remove: "'" | remove: '<' | remove: '>' | remove: '&' | remove: '#' | remove: '?' | remove: '/' %}
155
+ {%- assign arch_id_prefix = include.release_id | default: "download" | append: "-" | append: arch_name_id_safe | downcase | replace: " ", "-" %}
156
+ <div class="{{ arch_col_class }}"{% if arch_orphan_style != "" %} style="{{ arch_orphan_style }}"{% endif %}>
157
+ <div class="d-flex flex-column align-items-start p-3">
158
+ <div class="mb-2">
159
+ <div class="fs-2"><i class="fa-solid fa-microchip"></i></div>
160
+ <div class="h3">{{ arch_name | escape }}</div>
161
+ </div>
162
+
163
+ {%- assign has_download_button = false %}
164
+ {%- if arch_data.download and arch_data.download != "" %}
165
+ {%- assign has_download_button = true %}
166
+ {%- endif %}
167
+
168
+ {%- assign has_checksum_row = false %}
169
+ {%- if arch_data.checksum and arch_data.checksum != "" or arch_data.checksum_value and arch_data.checksum_value != "" %}
170
+ {%- assign has_checksum_row = true %}
171
+ {%- endif %}
172
+
173
+ {%- assign has_signature_row = false %}
174
+ {%- if arch_data.signature and arch_data.signature != "" or arch_data.signature_value and arch_data.signature_value != "" %}
175
+ {%- assign has_signature_row = true %}
176
+ {%- endif %}
177
+
178
+ {%- if has_download_button or has_checksum_row or has_signature_row %}
179
+ {%- comment %} These rows share this gap-2 flex-column wrapper so
180
+ spacing between whichever rows are present is handled by the gap
181
+ alone — no per-row conditional mt-2 class needed (Bootstrap's spacing
182
+ scale maps 2 to the same 0.5rem for both mt-* and gap-*, so this is a
183
+ visual no-op versus a conditional-margin approach, just less
184
+ conditional logic). {% endcomment %}
185
+ <div class="w-100 mb-3 pb-3 border-bottom d-flex flex-column gap-2">
186
+ {%- if has_download_button %}
187
+ {%- comment %} d-flex flex-wrap gap-2, not Bootstrap's joined
188
+ .btn-group, so the button reflows instead of overflowing into the
189
+ neighboring architecture box at narrow column widths (e.g. the
190
+ 4-column arrangement). Reuses base/link.html.liquid, the theme's
191
+ canonical link/button component. {% endcomment %}
192
+ <div class="d-flex flex-wrap gap-2" role="group" aria-label="Primary download actions">
193
+ {%- include base/link.html.liquid class="btn btn-primary flex-fill text-start" role="button" name="Download" link=arch_data.download icon="fa-solid fa-download" icon_position="start" -%}
194
+ </div>
195
+ {%- endif %}
196
+
197
+ {%- if has_checksum_row %}
198
+ {%- comment %} checksum/signature and checksum_value/signature_value
199
+ are two views of the same file, merged into one input-group row
200
+ (rather than a link button plus a separate copy field) via
201
+ base/download_filevalue.html.liquid — see that file for the row's
202
+ own markup and its .link-primary / copy-value details.
203
+ {% endcomment %}
204
+ {%- assign checksum_display = arch_data.checksum_value | default: arch_data.checksum %}
205
+ {%- include base/download_filevalue.html.liquid arch_name=arch_name field=arch_data.checksum field_value=checksum_display icon="fa-solid fa-shield-halved" label="checksum" id_prefix=arch_id_prefix -%}
206
+ {%- endif %}
207
+
208
+ {%- if has_signature_row %}
209
+ {%- assign signature_display = arch_data.signature_value | default: arch_data.signature %}
210
+ {%- include base/download_filevalue.html.liquid arch_name=arch_name field=arch_data.signature field_value=signature_display icon="fa-solid fa-file-signature" label="signature" id_prefix=arch_id_prefix -%}
211
+ {%- endif %}
212
+ </div>
213
+ {%- endif %}
214
+
215
+ {%- if has_mirrors %}
216
+ <div class="d-flex flex-wrap gap-2">
217
+ {%- if arch_data.mirrors.iso and arch_data.mirrors.iso != "" %}
218
+ {%- include base/link.html.liquid class="btn btn-outline-primary flex-fill text-start" role="button" name="ISO Mirrors" link=arch_data.mirrors.iso icon="fa-solid fa-compact-disc" icon_position="start" -%}
219
+ {%- endif %}
220
+ {%- if arch_data.mirrors.rpm and arch_data.mirrors.rpm != "" %}
221
+ {%- include base/link.html.liquid class="btn btn-outline-primary flex-fill text-start" role="button" name="RPM Mirrors" link=arch_data.mirrors.rpm icon="fa-solid fa-box" icon_position="start" -%}
222
+ {%- endif %}
223
+ {%- if arch_data.mirrors.cloud and arch_data.mirrors.cloud != "" %}
224
+ {%- include base/link.html.liquid class="btn btn-outline-primary flex-fill text-start" role="button" name="Cloud Images" link=arch_data.mirrors.cloud icon="fa-solid fa-cloud" icon_position="start" -%}
225
+ {%- endif %}
226
+ {%- if arch_data.mirrors.containers and arch_data.mirrors.containers != "" %}
227
+ {%- include base/link.html.liquid class="btn btn-outline-primary flex-fill text-start" role="button" name="Container Images" link=arch_data.mirrors.containers icon="fa-solid fa-cubes" icon_position="start" -%}
228
+ {%- endif %}
229
+ {%- if arch_data.mirrors.vagrant and arch_data.mirrors.vagrant != "" %}
230
+ {%- include base/link.html.liquid class="btn btn-outline-primary flex-fill text-start" role="button" name="Vagrant Boxes" link=arch_data.mirrors.vagrant icon="fa-solid fa-box-archive" icon_position="start" -%}
231
+ {%- endif %}
232
+ {%- if arch_data.mirrors.torrent and arch_data.mirrors.torrent != "" %}
233
+ {%- include base/link.html.liquid class="btn btn-outline-primary flex-fill text-start" role="button" name="Torrent" link=arch_data.mirrors.torrent icon="fa-solid fa-magnet" icon_position="start" -%}
234
+ {%- endif %}
235
+ </div>
236
+ {%- endif %}
237
+ </div>
238
+ </div>
239
+ {%- endfor %}
240
+ </div>
@@ -0,0 +1,27 @@
1
+ {% comment %}
2
+ ================================================================================
3
+ Utility: Download Commands List
4
+ Purpose: Command snippets for one release, rendered as one collapsible item
5
+ inside download_sections.html.liquid's shared documentation/commands/eol
6
+ accordion — release-wide metadata that applies in common to every
7
+ architecture above. Called from download_sections.html.liquid.
8
+
9
+ Required Inputs:
10
+ - commands: Array of {title, lines}
11
+ - accordion_id: Parent accordion's id, for data-bs-parent scoping
12
+ - item_id: This item's unique collapse id
13
+ - expanded: true starts this item open; false starts it closed. Passed
14
+ through from the caller (see download_sections.html.liquid).
15
+ ================================================================================
16
+ {% endcomment %}
17
+ {%- capture download_commands_body -%}
18
+ {%- for row in include.commands %}
19
+ {%- if row.title and row.title != "" %}
20
+ <p class="mb-1">{{ row.title }}</p>
21
+ {%- endif %}
22
+ {%- if row.lines and row.lines != "" %}
23
+ <pre class="mb-3"><code>{{ row.lines | escape }}</code></pre>
24
+ {%- endif %}
25
+ {%- endfor %}
26
+ {%- endcapture -%}
27
+ {%- include base/download_accordion_item.html.liquid icon="fa-solid fa-terminal" title="Migration" item_id=include.item_id accordion_id=include.accordion_id expanded=include.expanded body=download_commands_body -%}
@@ -0,0 +1,24 @@
1
+ {% comment %}
2
+ ================================================================================
3
+ Utility: Download Documentation List
4
+ Purpose: Documentation links for one release, rendered as one collapsible
5
+ item inside download_sections.html.liquid's shared documentation/commands/
6
+ eol/screenshots accordion — release-wide metadata that applies in common to
7
+ every architecture above. Called from download_sections.html.liquid.
8
+
9
+ Required Inputs:
10
+ - documentation: Array of {title, link}
11
+ - accordion_id: Parent accordion's id, for data-bs-parent scoping
12
+ - item_id: This item's unique collapse id
13
+ - expanded: true starts this item open; false starts it closed. Passed
14
+ through from the caller (see download_sections.html.liquid).
15
+ ================================================================================
16
+ {% endcomment %}
17
+ {%- capture download_documentation_body -%}
18
+ {%- for row in include.documentation %}
19
+ {%- if row.title and row.title != "" %}
20
+ {%- include base/link.html.liquid class="btn btn-outline-primary" role="button" name=row.title link=row.link icon="fa-solid fa-up-right-from-square" icon_position="start" -%}
21
+ {%- endif %}
22
+ {%- endfor %}
23
+ {%- endcapture -%}
24
+ {%- include base/download_accordion_item.html.liquid icon="fa-solid fa-book" title="Documentation" item_id=include.item_id accordion_id=include.accordion_id expanded=include.expanded body_class="d-flex flex-wrap gap-2" body=download_documentation_body -%}
@@ -0,0 +1,29 @@
1
+ {% comment %}
2
+ ================================================================================
3
+ Utility: Download End-of-life List
4
+ Purpose: End-of-life milestones for one release, rendered as one collapsible
5
+ item inside download_sections.html.liquid's shared documentation/commands/
6
+ eol accordion — release-wide metadata that applies in common to every
7
+ architecture above. Called from download_sections.html.liquid.
8
+
9
+ Required Inputs:
10
+ - eol: Array of {date, description}
11
+ - accordion_id: Parent accordion's id, for data-bs-parent scoping
12
+ - item_id: This item's unique collapse id
13
+ - expanded: true starts this item open; false starts it closed. Passed
14
+ through from the caller (see download_sections.html.liquid).
15
+ ================================================================================
16
+ {% endcomment %}
17
+ {%- capture download_eol_body -%}
18
+ <ul class="list-unstyled mb-0">
19
+ {%- for row in include.eol %}
20
+ <li class="mb-1">
21
+ {%- if row.date and row.date != "" -%}
22
+ <strong>{{ row.date }}</strong>{% if row.description and row.description != "" %} — {% endif %}
23
+ {%- endif -%}
24
+ {{ row.description }}
25
+ </li>
26
+ {%- endfor %}
27
+ </ul>
28
+ {%- endcapture -%}
29
+ {%- include base/download_accordion_item.html.liquid icon="fa-solid fa-hourglass-end" title="End-of-life" item_id=include.item_id accordion_id=include.accordion_id expanded=include.expanded body=download_eol_body -%}
@@ -0,0 +1,68 @@
1
+ {% comment %}
2
+ ================================================================================
3
+ Utility: Download File Value Row
4
+ Purpose: One input-group row pairing a link-to-file icon with its copyable
5
+ text value — the shared shape behind the checksum and signature rows in
6
+ download_architecture.html.liquid's per-architecture box.
7
+
8
+ A page using the copy button below must set `with_copyvalue: true` in its
9
+ front matter — base/copyvalue.html.liquid (loaded globally from
10
+ head.html.liquid, see src/JS/copyvalue.js for the copy-btn contract) is an
11
+ opt-in include, not a global default, despite its own schema listing `true`
12
+ as with_copyvalue's default (that default only covers with_copyvalue_data's
13
+ sub-fields once the feature is already on).
14
+
15
+ Required Inputs:
16
+ - arch_name: Architecture label, used only in the input's aria-label
17
+ (e.g. "Checksum value for x86_64").
18
+ - field: The file's own URL (checksum/signature). Empty renders the
19
+ left icon as a non-interactive glyph instead of a link.
20
+ - field_value: The literal value to render/copy. Callers resolve their own
21
+ `X_value | default: X` fallback before calling this include —
22
+ this include renders field_value as-is.
23
+ - icon: Font Awesome icon class for the left icon (e.g.
24
+ "fa-solid fa-shield-halved").
25
+ - label: Lowercase noun used in tooltip/aria-label text (e.g.
26
+ "checksum", "signature").
27
+ - id_prefix: Page-unique prefix (release id + architecture label, built by
28
+ download_architecture.html.liquid) combined with `label` to
29
+ give the `<input>` a unique id — every form field needs an id
30
+ or name so the browser can autofill/target it correctly, and
31
+ arch_name/label alone aren't page-unique (the same
32
+ architecture repeats across every release/tab on the page).
33
+
34
+ The clickable icon-link (when `field` is present) is rendered via
35
+ base/link.html.liquid — the theme's canonical link component — rather than a
36
+ hand-rolled `<a>`, so it inherits that component's javascript:/data:/vbscript:
37
+ scheme neutralization and escaping. This also means, like the Download and
38
+ Mirror buttons in download_architecture.html.liquid, it only renders when
39
+ `page.with_link` is true; the non-interactive `<span>` fallback below covers
40
+ both an empty `field` and a with_link-disabled page.
41
+ ================================================================================
42
+ {% endcomment %}
43
+ {%- assign download_filevalue_label_cap = include.label | capitalize -%}
44
+ {%- assign download_filevalue_id = include.id_prefix | append: "-" | append: include.label -%}
45
+ {%- assign download_filevalue_open_text = "Open " | append: include.label | append: " file" -%}
46
+ <div class="input-group input-group-sm">
47
+ {%- comment %} .link-primary is a Bootstrap utility, not a custom class —
48
+ it reads as a clickable link instead of the plain body-color text
49
+ .input-group-text renders by default, and compiles with `!important` so
50
+ it wins over .input-group-text's color unconditionally, no custom SCSS or
51
+ cascade ordering required. {% endcomment %}
52
+ {%- if include.field and include.field != "" %}
53
+ {%- include base/link.html.liquid
54
+ class="input-group-text link-primary text-decoration-none"
55
+ role="button"
56
+ link=include.field
57
+ icon=include.icon
58
+ aria_label=download_filevalue_open_text
59
+ data_bs_toggle="tooltip"
60
+ data_bs_title=download_filevalue_open_text -%}
61
+ {%- else %}
62
+ <span class="input-group-text"><i class="{{ include.icon }}"></i></span>
63
+ {%- endif %}
64
+ <input type="text" id="{{ download_filevalue_id }}" class="form-control font-monospace" readonly value="{{ include.field_value | escape }}" aria-label="{{ download_filevalue_label_cap }} value for {{ include.arch_name | escape }}">
65
+ {%- comment %} data-copy-value MUST go through `| escape` — see
66
+ base/copyvalue.html.liquid's own security note. {% endcomment %}
67
+ <span class="input-group-text copy-btn" role="button" data-copy-value="{{ include.field_value | escape }}" data-bs-toggle="tooltip" data-bs-title="Copy {{ include.label }} value" aria-label="Copy {{ include.label }} value"><span class="fa-regular fa-copy"></span></span>
68
+ </div>
@@ -0,0 +1,79 @@
1
+ {% comment %}
2
+ ================================================================================
3
+ Utility: Download Screenshots Carousel
4
+ Purpose: Bootstrap carousel of screenshots for one release, rendered as one
5
+ collapsible item inside download_sections.html.liquid's shared
6
+ documentation/commands/eol/screenshots accordion — a sibling of Documentation
7
+ and Migration, not nested inside either of them. Called from
8
+ download_sections.html.liquid.
9
+
10
+ Required Inputs:
11
+ - screenshots: Array of {src, alt, title, description} — title/description
12
+ are optional; when present they render as a Bootstrap carousel caption
13
+ (https://getbootstrap.com/docs/5.3/components/carousel/#captions)
14
+ overlaid on the slide, hidden below md so it doesn't crowd small screens.
15
+ The caption heading is a `<div class="h5">`, not a real `<h5>` — same as
16
+ the accordion-item headers' `<div class="accordion-header h2">` — because
17
+ jekyll-toc auto-injects a "#" anchor into every real heading tag it scans,
18
+ which an overlaid caption doesn't want.
19
+ - image_base_path: Resolved base path under /assets/img/ (see
20
+ download_schema.yml's image_base_path description)
21
+ - release_id: Unique id of the parent tab-pane, used to scope carousel ids
22
+ - accordion_id: Parent accordion's id, for data-bs-parent scoping
23
+ - item_id: This item's unique collapse id
24
+ - expanded: true starts this item open; false starts it closed. Passed
25
+ through from the caller (see download_sections.html.liquid).
26
+
27
+ Each slide is wrapped in Bootstrap's `ratio ratio-16x9` utility, the same
28
+ ratio artwork.html.liquid uses for its own image presentation
29
+ (artwork_schema.yml's image_class default: `ratio ratio-16x9 rounded
30
+ bg-dark bg-artwork`), so screenshots of any native size crop to a
31
+ consistent 16:9 box instead of each slide having its own height.
32
+ `object-fit-cover` on the `<img>` itself does the actual cropping — `.ratio`
33
+ alone only stretches its child to fill the box.
34
+ ================================================================================
35
+ {% endcomment %}
36
+ {%- capture download_screenshots_body -%}
37
+ <div class="p-3">
38
+ <div id="carouselScreenshotsIndicators-{{ include.release_id }}" class="carousel carousel-dark slide" data-bs-ride="true">
39
+ <div class="carousel-indicators">
40
+ {%- for row in include.screenshots %}
41
+ <button
42
+ {%- if forloop.first %} class="active" aria-current="true"{% endif %}
43
+ type="button"
44
+ data-bs-target="#carouselScreenshotsIndicators-{{ include.release_id }}"
45
+ data-bs-slide-to="{{ forloop.index0 }}"
46
+ aria-label="Screenshot {{ forloop.index }}"></button>
47
+ {%- endfor %}
48
+ </div>
49
+ <div class="carousel-inner">
50
+ {%- for row in include.screenshots %}
51
+ <div class="carousel-item{% if forloop.first %} active{% endif %}">
52
+ <div class="ratio ratio-16x9">
53
+ <img class="object-fit-cover" src="{{ site.baseurl }}{{ include.image_base_path }}{{ row.src | escape }}" alt="{{ row.alt | escape }}" />
54
+ </div>
55
+ {%- if row.title and row.title != "" or row.description and row.description != "" %}
56
+ <div class="carousel-caption d-none d-md-block">
57
+ {%- if row.title and row.title != "" %}
58
+ <div class="h5">{{ row.title }}</div>
59
+ {%- endif %}
60
+ {%- if row.description and row.description != "" %}
61
+ <p>{{ row.description }}</p>
62
+ {%- endif %}
63
+ </div>
64
+ {%- endif %}
65
+ </div>
66
+ {%- endfor %}
67
+ </div>
68
+ <button class="carousel-control-prev" type="button" data-bs-target="#carouselScreenshotsIndicators-{{ include.release_id }}" data-bs-slide="prev">
69
+ <span class="carousel-control-prev-icon" aria-hidden="true"></span>
70
+ <span class="visually-hidden">Previous</span>
71
+ </button>
72
+ <button class="carousel-control-next" type="button" data-bs-target="#carouselScreenshotsIndicators-{{ include.release_id }}" data-bs-slide="next">
73
+ <span class="carousel-control-next-icon" aria-hidden="true"></span>
74
+ <span class="visually-hidden">Next</span>
75
+ </button>
76
+ </div>
77
+ </div>
78
+ {%- endcapture -%}
79
+ {%- include base/download_accordion_item.html.liquid icon="fa-solid fa-desktop" title="Screenshots" item_id=include.item_id accordion_id=include.accordion_id expanded=include.expanded body_class="p-0" body=download_screenshots_body -%}
@@ -0,0 +1,51 @@
1
+ {% comment %}
2
+ ================================================================================
3
+ Utility: Download Release Sections
4
+ Purpose: Renders one release's architecture/documentation/eol/commands/
5
+ screenshots sections, in a fixed order, each only if its data is present.
6
+ Shared by download.html.liquid's tabbed (multiple releases) and untabbed
7
+ (single release) render paths, since the section content is identical either
8
+ way — only the surrounding tab markup differs. Documentation, commands, eol,
9
+ and screenshots render as sibling items inside one shared Bootstrap accordion
10
+ below the architecture grid — collapsible, so they read as release-wide
11
+ metadata that applies in common to every architecture above rather than
12
+ disconnected trailing content. All start collapsed.
13
+
14
+ Required Inputs:
15
+ - release_data: One release's content object
16
+ - release_id: Unique id for this release, used to scope nested element ids
17
+ (the documentation/commands/eol/screenshots accordion, the screenshots
18
+ carousel's own ids)
19
+ - image_base_path: Resolved base path under /assets/img/
20
+ ================================================================================
21
+ {% endcomment %}
22
+
23
+ {%- if include.release_data.architecture.size > 0 %}
24
+ {%- include base/download_architecture.html.liquid architecture=include.release_data.architecture release_id=include.release_id -%}
25
+ {%- endif %}
26
+
27
+ {%- assign meta_accordion_id = include.release_id | append: "-meta-accordion" %}
28
+ {%- assign meta_screenshots_id = meta_accordion_id | append: "-screenshots" %}
29
+ {%- assign meta_documentation_id = meta_accordion_id | append: "-documentation" %}
30
+ {%- assign meta_commands_id = meta_accordion_id | append: "-commands" %}
31
+ {%- assign meta_eol_id = meta_accordion_id | append: "-eol" %}
32
+
33
+ {%- if include.release_data.documentation.size > 0 or include.release_data.commands.size > 0 or include.release_data.eol.size > 0 or include.release_data.screenshots.size > 0 %}
34
+ <div class="accordion accordion-flush mt-3" id="{{ meta_accordion_id }}">
35
+ {%- if include.release_data.screenshots.size > 0 %}
36
+ {%- include base/download_screenshots.html.liquid screenshots=include.release_data.screenshots image_base_path=include.image_base_path release_id=include.release_id accordion_id=meta_accordion_id item_id=meta_screenshots_id expanded=false -%}
37
+ {%- endif %}
38
+
39
+ {%- if include.release_data.documentation.size > 0 %}
40
+ {%- include base/download_documentation.html.liquid documentation=include.release_data.documentation accordion_id=meta_accordion_id item_id=meta_documentation_id expanded=false -%}
41
+ {%- endif %}
42
+
43
+ {%- if include.release_data.commands.size > 0 %}
44
+ {%- include base/download_commands.html.liquid commands=include.release_data.commands accordion_id=meta_accordion_id item_id=meta_commands_id expanded=false -%}
45
+ {%- endif %}
46
+
47
+ {%- if include.release_data.eol.size > 0 %}
48
+ {%- include base/download_eol.html.liquid eol=include.release_data.eol accordion_id=meta_accordion_id item_id=meta_eol_id expanded=false -%}
49
+ {%- endif %}
50
+ </div>
51
+ {%- endif %}
@@ -83,7 +83,9 @@ Data Object Properties:
83
83
  {%- endif %}
84
84
  </div>
85
85
  {%- if item.title_lead %}
86
- <p class="mb-3">{{ item.title_lead }}</p>
86
+ {%- capture item_title_lead_source %}{{ item.title_lead | strip_newlines }}
87
+ {: .mb-3 }{% endcapture %}
88
+ {{ item_title_lead_source | markdownify }}
87
89
  {%- endif %}
88
90
  </div>
89
91
  </div>
@@ -117,9 +119,9 @@ Data Object Properties:
117
119
  {%- if item.title != page.title %}
118
120
  {%- if show_page_filename == "true" %}
119
121
  {%- assign item_name = item.name | remove: '.md' %}
120
- <li>{% include base/link.html.liquid name=item_name link=item.url %}{% if item.title_lead != nil %} &mdash; {{ item.title_lead }}{% endif %}</li>
122
+ <li>{% include base/link.html.liquid name=item_name link=item.url %}{% if item.title_lead != nil %} &mdash; {{ item.title_lead | strip_newlines | markdownify | remove: "<p>" | remove: "</p>" | strip }}{% endif %}</li>
121
123
  {%- else %}
122
- <li>{% include base/link.html.liquid name=item.title link=item.url %}{% if item.title_lead != nil %} &mdash; {{ item.title_lead }}{% endif %}</li>
124
+ <li>{% include base/link.html.liquid name=item.title link=item.url %}{% if item.title_lead != nil %} &mdash; {{ item.title_lead | strip_newlines | markdownify | remove: "<p>" | remove: "</p>" | strip }}{% endif %}</li>
123
125
  {%- endif %}
124
126
  {%- endif %}
125
127
  {%- endfor %}
@@ -146,7 +148,7 @@ Data Object Properties:
146
148
  <td>{% include base/link.html.liquid name=item.title link=item.url %}</td>
147
149
  {%- endif %}
148
150
  {%- endif %}
149
- <td>{{ item.title_lead }}</td>
151
+ <td>{{ item.title_lead | strip_newlines | markdownify }}</td>
150
152
  </tr>
151
153
  {%- endfor %}
152
154
  </tbody>
@@ -179,7 +181,7 @@ Data Object Properties:
179
181
  <tr>
180
182
  <td>{% include base/link.html.liquid name=item.component.name link=item.url %}</td>
181
183
  <td class="text-nowrap">{{ status_icon }}</td>
182
- <td>{{ item.title_lead }}</td>
184
+ <td>{{ item.title_lead | strip_newlines | markdownify }}</td>
183
185
  </tr>
184
186
  {%- endfor %}
185
187
  </tbody>
@@ -16,7 +16,7 @@ Required Fields (per item in the members array):
16
16
  - url: Sponsor website URL
17
17
 
18
18
  Optional Data Fields:
19
- - image_base_path: Base path for bare filenames (default: /assets/img/base/)
19
+ - image_base_path: Base path for bare filenames (default: /assets/img/components/sponsors/)
20
20
 
21
21
  Optional Inputs (from include):
22
22
  - data: Sponsors data object (overrides all fallbacks)
@@ -17,7 +17,7 @@ Required Fields (per item in the members array):
17
17
  - url: Sponsor website URL
18
18
 
19
19
  Optional Data Fields:
20
- - image_base_path: Base path for bare filenames (default: /assets/img/base/)
20
+ - image_base_path: Base path for bare filenames (default: /assets/img/components/sponsors/)
21
21
 
22
22
  Optional Inputs (from include):
23
23
  - data: Sponsors data object (overrides all fallbacks)
@@ -63,7 +63,12 @@ Conditional Logic:
63
63
  <div class="{{ class }}">
64
64
  <p class="{{ title_class }}">{{ title }}</p>
65
65
  {% if title_lead != "" %}
66
- <p class="{{ title_lead_class }}">{{ title_lead }}</p>
66
+ {%- assign title_lead_ial = title_lead_class | split: " " | join: " ." | prepend: "." %}
67
+ {%- capture title_lead_source %}{{ title_lead | strip_newlines }}
68
+ {%- if title_lead_class and title_lead_class != "" %}
69
+ {: {{ title_lead_ial }} }
70
+ {%- endif %}{% endcapture %}
71
+ {{ title_lead_source | markdownify }}
67
72
  {% endif %}
68
73
  </div>
69
74
  </div>