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

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 (104) hide show
  1. checksums.yaml +4 -4
  2. data/_config.yml +1 -0
  3. data/_data/base/download.yml +23 -0
  4. data/_data/base/download_schema.yml +254 -0
  5. data/_data/base/navbar_schema.yml +6 -6
  6. data/_data/base/navindex_schema.yml +1 -1
  7. data/_data/base/sponsors.yml +0 -1
  8. data/_data/base/sponsors_schema.yml +13 -4
  9. data/_data/base/title_schema.yml +3 -1
  10. data/_includes/base/download.html.liquid +146 -0
  11. data/_includes/base/download_accordion_item.html.liquid +39 -0
  12. data/_includes/base/download_architecture.html.liquid +240 -0
  13. data/_includes/base/download_commands.html.liquid +27 -0
  14. data/_includes/base/download_documentation.html.liquid +24 -0
  15. data/_includes/base/download_eol.html.liquid +29 -0
  16. data/_includes/base/download_filevalue.html.liquid +68 -0
  17. data/_includes/base/download_screenshots.html.liquid +79 -0
  18. data/_includes/base/download_sections.html.liquid +51 -0
  19. data/_includes/base/navindex.html.liquid +7 -5
  20. data/_includes/base/sponsors-cards.html.liquid +1 -1
  21. data/_includes/base/sponsors-carousel.html.liquid +1 -1
  22. data/_includes/base/title.html.liquid +6 -1
  23. data/_sass/base/_download.scss +70 -0
  24. data/_sass/base/_variables.scss +7 -0
  25. data/assets/css/base/stylesheet.min.scss +1 -0
  26. data/assets/js/base/datatable.js +7 -2
  27. data/assets/js/base/highlight.js +1 -1
  28. metadata +13 -77
  29. data/_data/download/cards.yml +0 -309
  30. data/_data/download/navbar.yml +0 -11
  31. data/_includes/download/cards-body-commands.html +0 -7
  32. data/_includes/download/cards-body-convert.html +0 -10
  33. data/_includes/download/cards-body-doc.html +0 -9
  34. data/_includes/download/cards-body-documentation.html +0 -11
  35. data/_includes/download/cards-body-eol.html +0 -16
  36. data/_includes/download/cards-body-mirrors.html +0 -8
  37. data/_includes/download/cards-body-screenshot.html +0 -26
  38. data/_includes/download/cards-body-screenshots.html +0 -32
  39. data/_includes/download/cards-body.html +0 -8
  40. data/_includes/download/cards-footer.html +0 -3
  41. data/_includes/download/cards-header-commands.html +0 -8
  42. data/_includes/download/cards-header-convert.html +0 -8
  43. data/_includes/download/cards-header-doc.html +0 -8
  44. data/_includes/download/cards-header-documentation.html +0 -8
  45. data/_includes/download/cards-header-eol.html +0 -8
  46. data/_includes/download/cards-header-mirrors.html +0 -13
  47. data/_includes/download/cards-header-screenshot.html +0 -8
  48. data/_includes/download/cards-header-screenshots.html +0 -8
  49. data/_includes/download/cards-header.html +0 -13
  50. data/_includes/download/cards.html +0 -120
  51. data/_layouts/download/cards.html +0 -7
  52. data/_layouts/download/default.html +0 -7
  53. data/assets/img/base/centos-colors.gpl +0 -55
  54. data/assets/img/base/example-ogp-image.svg +0 -297
  55. data/assets/img/base/example-sponsors-design.svg +0 -226
  56. data/assets/img/base/example-sponsors-logo-1.svg +0 -120
  57. data/assets/img/base/example-sponsors-logo-2.svg +0 -116
  58. data/assets/img/base/example-sponsors-logo-3.svg +0 -123
  59. data/assets/img/base/example-sponsors-logo-4.svg +0 -116
  60. data/assets/img/base/example-sponsors-logo-5.svg +0 -116
  61. data/assets/img/base/example-sponsors-logo-6.svg +0 -116
  62. data/assets/img/base/example-sponsors-logo-7.svg +0 -116
  63. data/assets/img/base/example-sponsors-logo-8.svg +0 -110
  64. data/assets/img/base/page-layout-default.svg +0 -1196
  65. data/assets/img/base/page-with-alert.svg +0 -438
  66. data/assets/img/base/page-with-announcement.svg +0 -441
  67. data/assets/img/base/page-with-artwork.svg +0 -384
  68. data/assets/img/base/page-with-backtotop.svg +0 -502
  69. data/assets/img/base/page-with-bits.svg +0 -377
  70. data/assets/img/base/page-with-breadcrumb.svg +0 -354
  71. data/assets/img/base/page-with-breakingnews.svg +0 -433
  72. data/assets/img/base/page-with-calendar.svg +0 -57
  73. data/assets/img/base/page-with-color.svg +0 -57
  74. data/assets/img/base/page-with-copyright.svg +0 -506
  75. data/assets/img/base/page-with-copyvalue.svg +0 -57
  76. data/assets/img/base/page-with-datatable.svg +0 -57
  77. data/assets/img/base/page-with-event.svg +0 -448
  78. data/assets/img/base/page-with-fontawesome.svg +0 -147
  79. data/assets/img/base/page-with-footer.svg +0 -506
  80. data/assets/img/base/page-with-heading.svg +0 -57
  81. data/assets/img/base/page-with-highlight.svg +0 -86
  82. data/assets/img/base/page-with-image.svg +0 -57
  83. data/assets/img/base/page-with-link.svg +0 -57
  84. data/assets/img/base/page-with-locales.svg +0 -502
  85. data/assets/img/base/page-with-navbar.svg +0 -1060
  86. data/assets/img/base/page-with-navindex.svg +0 -279
  87. data/assets/img/base/page-with-ogp.svg +0 -401
  88. data/assets/img/base/page-with-project.svg +0 -853
  89. data/assets/img/base/page-with-shortcut.svg +0 -502
  90. data/assets/img/base/page-with-social.svg +0 -502
  91. data/assets/img/base/page-with-sponsors.svg +0 -502
  92. data/assets/img/base/page-with-title.svg +0 -324
  93. data/assets/img/base/page-with-toc.svg +0 -324
  94. data/assets/img/base/screenshot-1200x600.svg +0 -114
  95. data/assets/img/download/centos-linux-7-2009-screenshot-n.png +0 -0
  96. data/assets/img/download/centos-stream-8-screenshot-n.png +0 -0
  97. data/assets/img/download/centos-stream-9-screenshot-n.png +0 -0
  98. data/assets/img/download/distribution-release-screenshot-1.png +0 -0
  99. data/assets/img/download/distribution-release-screenshot-2.png +0 -0
  100. data/assets/img/download/distribution-release-screenshot-3.png +0 -0
  101. data/assets/img/download/distribution-release-screenshot-n.png +0 -0
  102. data/assets/img/download/distribution-release-screenshot-n.svg +0 -134
  103. data/assets/img/download/download.svg +0 -421
  104. data/assets/img/download/fig-the-downloads-cards-presentation-template.png +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b478d590320e1c0bfa50101d2a37ea82439f74cd87231c9b4ef20285b583211a
4
- data.tar.gz: b672dc7ccda2bf6ae4e2c7d95cecd2d3518f82345de0c8f1e80d26171a13f301
3
+ metadata.gz: 23bf21a6e35d2941d90d11a7aefac6c245c1e2811fa5945eccf8bca522c02b90
4
+ data.tar.gz: 3f4e5a418e6a8e949b528bc4762899a351bebb05bd835c53df0945517d825e4b
5
5
  SHA512:
6
- metadata.gz: c72e3f82fbecf8b002e996e06dddfb6216dcfd50adb9c41da33e441fdf8f61743afc48deee2da0440c11d42ebb3a5c0f8d376667f0b77ed384cf4ddba0dfa174
7
- data.tar.gz: 6ec4146d254ce33046cbd8fa613b4a6745a7be5e39f774c967a5148acd97fe08c451a5b72a0cf28dda81fbffc146876841bf3149981f0d983fab2353b2376225
6
+ metadata.gz: 02da80654ac1f33df8888665c3f562face66490047e0726437ad8ac56c501e16046f6b1b3d993678159483204bf3612fb2086de5fdee8ce2b608aa4fda176130
7
+ data.tar.gz: 8d39190e6c26dc5c274933988326cbabe1152052e9f6e60f1eeeb2faacfbf472918f572b15c84122f77120f2d4e71d0b5385b1e5cd2981412b70f02bc6a21699
data/_config.yml CHANGED
@@ -72,6 +72,7 @@ defaults:
72
72
  with_bits: false
73
73
  with_event: false
74
74
  with_calendar: false
75
+ with_download: false
75
76
  with_title: true
76
77
  with_preamble: true
77
78
  with_toc: true
@@ -0,0 +1,23 @@
1
+ ---
2
+ #
3
+ # site.data.base.download - Theme-shipped default data for the 'download'
4
+ # component. Sites normally override this via _data/download.yml.
5
+ #
6
+
7
+ - title: "Example Distribution"
8
+ description: |
9
+ A minimal example download entry, used as the fallback when a site
10
+ doesn't provide its own `_data/download.yml`.
11
+ releases:
12
+ "1.0":
13
+ architecture:
14
+ x86_64:
15
+ mirrors:
16
+ iso: "https://example.com/mirrorlist?arch=x86_64"
17
+ rpm: "https://example.com/repo/x86_64/"
18
+ documentation:
19
+ - title: Release Notes
20
+ link: "https://example.com/release-notes/"
21
+ eol:
22
+ - date: "1 January 2030"
23
+ description: "End of support."
@@ -0,0 +1,254 @@
1
+ title: Download Component Configuration
2
+ description: >-
3
+ Schema for configuring the 'Download' presentation component. Renders one or
4
+ more download entries, each with a tabbed release selector; every release
5
+ carries an architecture grid (each architecture with its own main
6
+ download/checksum/signature and mirror links),
7
+ release-wide documentation links, end-of-life notices, command snippets,
8
+ and a screenshot carousel. Sections render automatically when their data
9
+ is present — no separate visibility flag is needed per section. Data can
10
+ also come from a product-keyed `_data/download-<slug>.yml` file; assign
11
+ `site.data["download-<slug>"]` to a variable, then pass that variable as
12
+ the component's `data` parameter.
13
+ type: object
14
+ properties:
15
+ with_download:
16
+ type: boolean
17
+ default: false
18
+ description: >-
19
+ Enables or disables the Download component rendering. Set to `true` to
20
+ display the component; set to `false` (default) to skip rendering.
21
+ with_download_data:
22
+ type: array
23
+ default: []
24
+ description: >-
25
+ An array of download entries (e.g. one per distribution). When defined,
26
+ this data overrides any values set in the component's default
27
+ configuration file. Use the component's `title` include parameter to
28
+ render only a single matching entry from this list.
29
+ items:
30
+ type: object
31
+ properties:
32
+ title:
33
+ type: string
34
+ default: ""
35
+ description: >-
36
+ The name of this download entry (e.g. `CentOS Stream`). Also used
37
+ to match the component's `title` include parameter when filtering
38
+ to a single entry.
39
+ description:
40
+ type: string
41
+ default: ""
42
+ description: A short description of this download entry, shown above the release selector. Supports Markdown.
43
+ image_base_path:
44
+ type: string
45
+ default: ""
46
+ description: >-
47
+ Base path used to resolve bare filenames in this entry's
48
+ `screenshots` field below. Always a path under
49
+ `/assets/img/`; never include `site.baseurl` in this value — only
50
+ the path that comes after it, since the component prepends
51
+ `site.baseurl` itself at render time. When left empty (the
52
+ default), download.html.liquid computes it dynamically from the
53
+ current page's own URL — `/assets/img` + `page.url` — so every
54
+ page hosting this component gets its own collision-free
55
+ screenshot directory automatically (e.g. a page rendered at
56
+ `/examples/components/download-single-release/` resolves
57
+ screenshots under
58
+ `/assets/img/examples/components/download-single-release/`),
59
+ with no per-page configuration required. Set this explicitly only
60
+ to point at a shared/external location instead of the hosting
61
+ page's own directory.
62
+ releases:
63
+ type: object
64
+ default: {}
65
+ description: >-
66
+ A map of release identifiers (e.g. `9`, `8`, `v1.0`) to release
67
+ content. Always required, even for a project like CentOS Stream
68
+ that only ever has one active version — a single entry still
69
+ identifies which version the surrounding sections belong to. With
70
+ more than one entry, order determines tab order and the first key
71
+ is the active tab on load; with exactly one entry, no tab
72
+ selector renders at all and that release's sections render
73
+ directly, since a permanently-active single tab has nothing to
74
+ switch between.
75
+ properties:
76
+ "{release_id}":
77
+ type: object
78
+ description: >-
79
+ Placeholder for a release identifier — the actual map key is
80
+ any string you choose (e.g. `9`, `8`, `v1.0`); each key
81
+ identifies one release and the content described below.
82
+ properties:
83
+ icon:
84
+ type: string
85
+ default: ""
86
+ description: >-
87
+ Font Awesome icon class shown alongside this release's tab
88
+ label in the nav-pills selector (e.g. `fa-solid fa-expand`).
89
+ Only rendered when there's more than one release — a single,
90
+ non-interactive tab has no selector to label. Empty shows
91
+ the label alone.
92
+ architecture:
93
+ type: object
94
+ default: {}
95
+ description: >-
96
+ A map of architecture label (e.g. `x86_64`, `aarch64`) to
97
+ that architecture's own content — its main download/
98
+ checksum/signature and mirror links. Each architecture's
99
+ identity is defined once, as this map's key, instead of
100
+ being repeated as a field inside a separate structure that
101
+ could drift out of sync. Alternative images (flavors, e.g.
102
+ a desktop spin) are not modeled here — a flavor is just
103
+ another download entry, not a smaller variant of this one;
104
+ give it its own `with_download_data` entry (with its own
105
+ `architecture`/`mirrors`/`download`/`checksum`, and
106
+ `releases` keyed by flavor name to reuse the tab selector)
107
+ and link the two together via `documentation` or page
108
+ content.
109
+ properties:
110
+ "{architecture}":
111
+ type: object
112
+ description: >-
113
+ Placeholder for an architecture label — the actual map
114
+ key is any string you choose (e.g. `x86_64`,
115
+ `aarch64`); each key identifies one architecture and
116
+ the content described below.
117
+ properties:
118
+ download:
119
+ type: string
120
+ default: ""
121
+ description: >-
122
+ Direct download URL for this architecture's main
123
+ image. Rendered as a filled-primary Download button
124
+ above the checksum/signature rows and mirror
125
+ buttons. Empty hides the Download button.
126
+ checksum:
127
+ type: string
128
+ default: ""
129
+ description: >-
130
+ Checksum file URL for the `download` image above.
131
+ Rendered together with `checksum_value` as a single
132
+ input-group row: this URL becomes the row's left
133
+ icon-link (opens the checksum file); empty renders
134
+ the icon as a non-interactive glyph instead of a
135
+ link, but the row itself still renders if
136
+ `checksum_value` is set.
137
+ signature:
138
+ type: string
139
+ default: ""
140
+ description: >-
141
+ Detached GPG signature URL (e.g. a `.asc`/`.sig`
142
+ file) for the `checksum` manifest above, so its
143
+ authenticity can be verified independently of its
144
+ integrity. Rendered together with `signature_value`
145
+ as a single input-group row, the same pattern as
146
+ `checksum`/`checksum_value`: this URL becomes the
147
+ row's left icon-link; empty renders the icon as a
148
+ non-interactive glyph instead of a link.
149
+ checksum_value:
150
+ type: string
151
+ default: ""
152
+ description: >-
153
+ The literal checksum digest (e.g. a SHA256 hex
154
+ string) for the `download` image above, distinct
155
+ from `checksum`, which links to the checksum file
156
+ itself rather than holding its value. Rendered as
157
+ the read-only, copy-to-clipboard text of the same
158
+ input-group row as `checksum` (via the copyvalue
159
+ component), so it can be pasted directly into a
160
+ terminal to compare against a locally computed
161
+ checksum. When empty but `checksum` is set, the row
162
+ still renders and its copyable text falls back to
163
+ the `checksum` URL itself.
164
+ signature_value:
165
+ type: string
166
+ default: ""
167
+ description: >-
168
+ The GPG key fingerprint used to produce `signature`
169
+ above, distinct from `signature`, which links to the
170
+ detached signature file itself rather than holding a
171
+ copyable value. Rendered as the read-only,
172
+ copy-to-clipboard text of the same input-group row as
173
+ `signature` (via the copyvalue component), the same
174
+ pattern most distros use to publish a signing key's
175
+ fingerprint for manual verification. When empty but
176
+ `signature` is set, the row still renders and its
177
+ copyable text falls back to the `signature` URL
178
+ itself.
179
+ mirrors:
180
+ type: object
181
+ default: {}
182
+ description: >-
183
+ Mirror links for this architecture's image types,
184
+ each rendered as its own outline-primary button
185
+ below the download/checksum/signature group.
186
+ properties:
187
+ iso: { type: string, default: "", description: "ISO mirror list URL. Empty hides the ISO Mirrors button." }
188
+ rpm: { type: string, default: "", description: "RPM repository URL. Empty hides the RPM Mirrors button." }
189
+ cloud: { type: string, default: "", description: "Cloud image directory URL. Empty hides the Cloud Images button." }
190
+ containers: { type: string, default: "", description: "Container image registry URL. Empty hides the Container Images button." }
191
+ vagrant: { type: string, default: "", description: "Vagrant box URL. Empty hides the Vagrant Boxes button." }
192
+ torrent: { type: string, default: "", description: "Torrent (.torrent/magnet) URL, an alternate mirror-load-reducing distribution method. Empty hides the Torrent button." }
193
+ additionalProperties: false
194
+ additionalProperties: false
195
+ additionalProperties: false
196
+ documentation:
197
+ type: array
198
+ description: >-
199
+ Documentation links, release-wide rather than per
200
+ architecture, presented as a compact secondary section
201
+ below the architecture grid — a small heading and a row of
202
+ outline buttons, not full cards.
203
+ items:
204
+ type: object
205
+ properties:
206
+ title: { type: string, default: "", description: "Visible link label." }
207
+ link: { type: string, default: "", description: "Target URL." }
208
+ additionalProperties: false
209
+ eol:
210
+ type: array
211
+ description: >-
212
+ End-of-life milestones, release-wide rather than per
213
+ architecture, presented as a compact secondary section
214
+ below the architecture grid — a small heading and a plain
215
+ list, not full cards.
216
+ items:
217
+ type: object
218
+ properties:
219
+ date: { type: string, default: "", description: "End-of-life date or milestone label, e.g. `31 May 2024`." }
220
+ description: { type: string, default: "", description: "Supporting text or HTML for this milestone." }
221
+ additionalProperties: false
222
+ commands:
223
+ type: array
224
+ description: >-
225
+ Command snippets ("Migration"), release-wide rather than
226
+ per architecture, presented as a compact secondary section
227
+ below the architecture grid — a small heading, each
228
+ command's own `title` as a smaller sub-title, and its code
229
+ block, not full cards.
230
+ items:
231
+ type: object
232
+ properties:
233
+ title: { type: string, default: "", description: "Sub-title shown above this command's code block." }
234
+ lines: { type: string, default: "", description: "Shell command(s), rendered inside a <pre><code> block." }
235
+ additionalProperties: false
236
+ screenshots:
237
+ type: array
238
+ description: >-
239
+ Images shown in the release's screenshot carousel,
240
+ release-wide rather than per architecture.
241
+ items:
242
+ type: object
243
+ properties:
244
+ src: { type: string, default: "", description: "Bare filename, resolved against `image_base_path`." }
245
+ alt: { type: string, default: "", description: "Alternative text for the image." }
246
+ title: { type: string, default: "", description: "Caption heading overlaid on the slide. Empty hides the caption's heading." }
247
+ description: { type: string, default: "", description: "Caption body text overlaid on the slide. Empty hides the caption's body." }
248
+ additionalProperties: false
249
+ additionalProperties: false
250
+ additionalProperties: false
251
+ required:
252
+ - title
253
+ additionalProperties: false
254
+ additionalProperties: false
@@ -120,10 +120,10 @@ properties:
120
120
  - name
121
121
  - link # Required for all nested links
122
122
  additionalProperties: false
123
- required:
124
- - name # Required for all top-level links/menus
125
- additionalProperties: false
126
- required:
127
- - navitems # Navigation is critical for the navbar
128
- additionalProperties: false
123
+ required:
124
+ - name # Required for all top-level links/menus
125
+ additionalProperties: false
126
+ required:
127
+ - navitems # Navigation is critical for the navbar
128
+ additionalProperties: false
129
129
  additionalProperties: false
@@ -25,7 +25,7 @@ properties:
25
25
  format: uri-reference
26
26
  title_lead:
27
27
  type: string
28
- description: A short description or lead paragraph displayed alongside the link in most formats.
28
+ description: A short description or lead paragraph displayed alongside the link in most formats. Supports Markdown.
29
29
  name:
30
30
  type: string
31
31
  description: The original filename or slug of the page, used when `show_page_filename` is `true`.
@@ -1,7 +1,6 @@
1
1
  ---
2
2
  title: Sponsors
3
3
  icon: "fa-solid fa-hand-holding-heart"
4
- image_base_path: "/assets/img/base/"
5
4
  message: |
6
5
  CentOS would not be possible without the support of our sponsors. We would
7
6
  like to thank the following product/service for being a CentOS sponsor. If
@@ -27,14 +27,23 @@ properties:
27
27
  type: string
28
28
  default: ""
29
29
  description: Introductory text rendered above the carousel, supports Markdown.
30
+ # NOTE: this default is hardcoded to match examples/jekyll/components/
31
+ # sponsors.md's current page.url (/components/sponsors/), not computed
32
+ # from it (YAML can't run Liquid). If that page is ever renamed or its
33
+ # permalink changes, update this default to match — nothing else does
34
+ # so automatically.
30
35
  image_base_path:
31
36
  type: string
32
- default: "/assets/img/base/"
37
+ default: "/assets/img/components/sponsors/"
33
38
  description: >-
34
39
  Base path prepended to bare logo filenames when building the image `src`
35
- attribute. Defaults to `/assets/img/base/`. Set to a different path
36
- (e.g. `/assets/img/sponsors/`) to store logos elsewhere on the site.
37
- Ignored when `image` is an absolute URL (`http://` or `https://`).
40
+ attribute. Defaults to `/assets/img/components/sponsors/`, where this
41
+ theme's own example logos live a fixed, static default (not
42
+ page-derived) since sponsors data is typically shared across every
43
+ page that enables with_sponsors, not unique per page. Set to a
44
+ different path (e.g. `/assets/img/my-real-sponsors/`) to store real
45
+ logos elsewhere on the site. Ignored when `image` is an absolute URL
46
+ (`http://` or `https://`).
38
47
  members:
39
48
  type: array
40
49
  default: []
@@ -36,7 +36,9 @@ properties:
36
36
  title_lead:
37
37
  type: string
38
38
  default: "`page.title_lead`"
39
- description: An optional lead text or introductory paragraph displayed immediately beneath the H1, providing context or summary.
39
+ description: >-
40
+ An optional lead text or introductory paragraph displayed immediately
41
+ beneath the H1, providing context or summary. Supports Markdown.
40
42
  title_lead_class:
41
43
  type: string
42
44
  default: "lead"
@@ -0,0 +1,146 @@
1
+ {% comment %}
2
+ ================================================================================
3
+ Template: Download Component
4
+ Purpose: Renders one or more download entries. Full data-driven section
5
+ component (like bits/sponsors), gated by with_download and resolved through
6
+ the standard 4-level fallback chain. Each entry in with_download_data is an
7
+ independent download "card" (e.g. one per distribution); include.title
8
+ filters to a single entry. Per-release sections (architecture/documentation/
9
+ eol/commands/screenshots) render automatically when their data is present —
10
+ no separate with_X flag per section, matching how card.html.liquid renders
11
+ its own sections only "if content". Shared between both render paths via
12
+ download_sections.html.liquid.
13
+
14
+ Alternative images (flavors) are not a section of this schema — a flavor
15
+ is just another download entry, linked via `documentation` or page
16
+ content rather than nested inside this one.
17
+
18
+ Data Source Hierarchy (in priority order):
19
+ 1. include.data - Explicitly passed array
20
+ 2. page.with_download_data - Page front matter
21
+ 3. site.data.download - Site data
22
+ 4. site.data.base.download - Theme defaults
23
+
24
+ Optional Inputs (from include):
25
+ - title: Render only the entry whose title matches exactly.
26
+ - id: HTML id prefix for the nav-pills tab selector (default: DownloadsCard-1).
27
+ ================================================================================
28
+ {% endcomment %}
29
+
30
+ {%- assign with_download = include.with_download
31
+ | default: page.with_download
32
+ %}
33
+
34
+ {%- assign with_download_data = include.data
35
+ | default: page.with_download_data
36
+ | default: site.data.download
37
+ | default: site.data.base.download
38
+ %}
39
+
40
+ {%- assign with_download_schema = site.data.base.download_schema.properties.with_download_data.items.properties %}
41
+
42
+ {%- if with_download %}
43
+ {%- for entry in with_download_data %}
44
+
45
+ {%- if include.title and include.title != "" and include.title != entry.title %}
46
+ {%- continue %}
47
+ {%- endif %}
48
+
49
+ {%- comment %} image_base_path defaults to a path derived from the current
50
+ page's own URL (page.url already ends in "/" for pretty permalinks) rather
51
+ than a fixed schema default — every page gets its own collision-free
52
+ screenshot directory automatically, with no per-page front matter needed,
53
+ unless the entry explicitly overrides it. See download_schema.yml's
54
+ image_base_path description for the full rationale. {% endcomment %}
55
+ {%- if entry.image_base_path and entry.image_base_path != "" %}
56
+ {%- assign entry_image_base_path = entry.image_base_path %}
57
+ {%- else %}
58
+ {%- assign entry_image_base_path = "/assets/img" | append: page.url %}
59
+ {%- endif %}
60
+
61
+ {%- comment %} entry.title feeds an HTML id (card_id) below. A hand-picked
62
+ remove: chain (mirroring link.html.liquid's anchor assignment) missed
63
+ characters like em dashes, which the id spec forbids just the same —
64
+ slugify handles any non-alphanumeric character, not just a fixed list. {% endcomment %}
65
+ {%- assign entry_title_id_safe = entry.title | slugify %}
66
+
67
+ {%- if include.id and include.id != "" %}
68
+ {%- assign card_id = include.id | append: "-" | append: entry_title_id_safe | downcase | replace: " ", "-" %}
69
+ {%- else %}
70
+ {%- assign card_id = "DownloadsCard-1-" | append: entry_title_id_safe | downcase | replace: " ", "-" %}
71
+ {%- endif %}
72
+
73
+ <div class="mb-1">
74
+ {%- assign single_release = nil %}
75
+ {%- if entry.releases.size == 1 %}
76
+ {%- assign single_release = entry.releases | first %}
77
+ {%- endif %}
78
+
79
+ {%- if entry.title and entry.title != "" %}
80
+ <div class="h2">
81
+ {{ entry.title | escape }}{% if single_release %} {{ single_release[0] | escape }}{% endif %}
82
+ </div>
83
+ {%- endif %}
84
+
85
+ {%- if entry.description and entry.description != "" %}
86
+ {{ entry.description | strip_newlines | markdownify }}
87
+ {%- endif %}
88
+
89
+ {%- comment %} A `releases` field always identifies which version(s) an
90
+ entry covers; when there's more than one, a tabbed nav-pills selector
91
+ switches between them. When there's exactly one — the common case for a
92
+ project like CentOS Stream, which only ever has one active version —
93
+ the tab selector is skipped and that release's sections render
94
+ directly, since a single, permanently-active, non-interactive tab would
95
+ just be chrome with nothing to switch between. {% endcomment %}
96
+ {%- if entry.releases.size == 1 %}
97
+ {%- for release in entry.releases %}
98
+ {%- assign release_data = release[1] %}
99
+ {%- assign release_id = card_id | append: "-pills1" %}
100
+ <div id="{{ release_id }}" class="bg-white rounded py-3 border">
101
+ {%- include base/download_sections.html.liquid release_data=release_data release_id=release_id image_base_path=entry_image_base_path -%}
102
+ </div>
103
+ {%- endfor %}
104
+ {%- elsif entry.releases.size > 1 %}
105
+ <ul class="nav nav-pills my-3 justify-content-start" id="{{ card_id }}-pills-tab" role="tablist">
106
+ {%- for release in entry.releases %}
107
+ <li class="nav-item" role="presentation">
108
+ <button class="nav-link{% if forloop.first %} active{% endif %} fw-bold"
109
+ id="{{ card_id }}-pills-tab{{ forloop.index }}"
110
+ data-bs-toggle="tab"
111
+ data-bs-target="#{{ card_id }}-pills{{ forloop.index }}"
112
+ type="button"
113
+ role="tab"
114
+ aria-controls="{{ card_id }}-pills-tab{{ forloop.index }}"
115
+ {%- if forloop.first %} aria-selected="true"{% endif %}
116
+ >{%- if release[1].icon and release[1].icon != "" %}<i class="{{ release[1].icon }} me-1"></i>{% endif %}{{ release[0] }}</button>
117
+ </li>
118
+ {%- endfor %}
119
+ </ul>
120
+
121
+ {%- comment %} border/rounded/bg-white live on this outer .tab-content div,
122
+ not the inner .tab-pane — a .tab-pane's own corners are always square, so if
123
+ the rounded, filled look lived there instead, its corners would poke past
124
+ this div's border at each corner. overflow-hidden clips each pane to match.
125
+ Mirrors the single-release path above, which only ever needs one
126
+ rounded/bordered/filled box. {% endcomment %}
127
+ <div class="tab-content border rounded overflow-hidden bg-white" id="{{ card_id }}-pills-tabContent">
128
+ {%- for release in entry.releases %}
129
+ {%- assign release_data = release[1] %}
130
+ {%- assign release_id = card_id | append: "-pills" | append: forloop.index %}
131
+ {%- assign tab_id = card_id | append: "-pills-tab" | append: forloop.index %}
132
+
133
+ <div class="tab-pane fade{% if forloop.first %} show active{% endif %} py-3"
134
+ id="{{ release_id }}"
135
+ role="tabpanel"
136
+ aria-labelledby="{{ tab_id }}"
137
+ tabindex="0">
138
+ {%- include base/download_sections.html.liquid release_data=release_data release_id=release_id image_base_path=entry_image_base_path -%}
139
+ </div>
140
+ {%- endfor %}
141
+ </div>
142
+ {%- endif %}
143
+
144
+ </div>
145
+ {%- endfor %}
146
+ {%- endif %}
@@ -0,0 +1,39 @@
1
+ {% comment %}
2
+ ================================================================================
3
+ Utility: Download Accordion Item
4
+ Purpose: The Bootstrap accordion-item/header/button/collapse/body shell
5
+ shared by the four sibling sections below a release's architecture grid
6
+ (Screenshots, Documentation, Migration, End-of-life) — see
7
+ download_sections.html.liquid for how these compose into one shared
8
+ accordion. Body content is built by the caller via a capture tag and passed
9
+ in as a pre-rendered HTML string, since Jekyll's Liquid include mechanism
10
+ has no block/yield content-passing.
11
+
12
+ Required Inputs:
13
+ - icon: Font Awesome icon class shown before the title.
14
+ - title: Accordion button label text.
15
+ - item_id: This item's unique collapse id.
16
+ - accordion_id: Parent accordion's id, for data-bs-parent scoping.
17
+ - expanded: true starts this item open; false starts it closed.
18
+ - body: Pre-rendered HTML string (built via a capture tag at the
19
+ call site) for the accordion-body's contents.
20
+
21
+ Optional Inputs:
22
+ - body_class: Extra classes appended to "accordion-body" (e.g.
23
+ "d-flex flex-wrap gap-2", "p-0"). Omit for a plain
24
+ accordion-body.
25
+ ================================================================================
26
+ {% endcomment %}
27
+ <div class="accordion-item">
28
+ <div class="accordion-header h2">
29
+ <button class="accordion-button{% unless include.expanded %} collapsed{% endunless %}" type="button" data-bs-toggle="collapse" data-bs-target="#{{ include.item_id }}" aria-expanded="{{ include.expanded }}" aria-controls="{{ include.item_id }}">
30
+ <i class="{{ include.icon }} me-2"></i>
31
+ <span class="mx-3 fw-bold">{{ include.title }}</span>
32
+ </button>
33
+ </div>
34
+ <div id="{{ include.item_id }}" class="accordion-collapse collapse{% if include.expanded %} show{% endif %}" data-bs-parent="#{{ include.accordion_id }}">
35
+ <div class="accordion-body{% if include.body_class and include.body_class != "" %} {{ include.body_class }}{% endif %}">
36
+ {{ include.body }}
37
+ </div>
38
+ </div>
39
+ </div>