jekyll-theme-centos 0.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.
Files changed (304) hide show
  1. checksums.yaml +7 -0
  2. data/_config.yml +196 -0
  3. data/_data/base/announcement_schema.yml +49 -0
  4. data/_data/base/artwork_schema.yml +46 -0
  5. data/_data/base/backtotop_schema.yml +59 -0
  6. data/_data/base/bits.yml +96 -0
  7. data/_data/base/bits_schema.yml +185 -0
  8. data/_data/base/breadcrumb_schema.yml +27 -0
  9. data/_data/base/breakingnews_schema.yml +67 -0
  10. data/_data/base/card_schema.yml +146 -0
  11. data/_data/base/color.yml +1042 -0
  12. data/_data/base/color_schema.yml +1036 -0
  13. data/_data/base/configuration_variables_schema.yml +42 -0
  14. data/_data/base/content.yml +2 -0
  15. data/_data/base/content_schema.yml +26 -0
  16. data/_data/base/copyright.yml +12 -0
  17. data/_data/base/copyright_schema.yml +74 -0
  18. data/_data/base/copyvalue_schema.yml +49 -0
  19. data/_data/base/datatable_schema.yml +57 -0
  20. data/_data/base/event_schema.yml +130 -0
  21. data/_data/base/fontawesome_schema.yml +62 -0
  22. data/_data/base/footer.yml +9 -0
  23. data/_data/base/footer_schema.yml +55 -0
  24. data/_data/base/head_schema.yml +19 -0
  25. data/_data/base/heading_anchor.yml +2 -0
  26. data/_data/base/heading_anchor_schema.yml +37 -0
  27. data/_data/base/highlight_schema.yml +98 -0
  28. data/_data/base/image_schema.yml +34 -0
  29. data/_data/base/languages.yml +186 -0
  30. data/_data/base/link_schema.yml +187 -0
  31. data/_data/base/locales_schema.yml +158 -0
  32. data/_data/base/navbar.yml +20 -0
  33. data/_data/base/navbar_schema.yml +129 -0
  34. data/_data/base/navindex_schema.yml +67 -0
  35. data/_data/base/ogp.yml +24 -0
  36. data/_data/base/ogp_schema.yml +192 -0
  37. data/_data/base/project.yml +37 -0
  38. data/_data/base/project_schema.yml +124 -0
  39. data/_data/base/script_schema.yml +41 -0
  40. data/_data/base/shortcut_schema.yml +74 -0
  41. data/_data/base/social.yml +26 -0
  42. data/_data/base/social_schema.yml +57 -0
  43. data/_data/base/sponsors.yml +41 -0
  44. data/_data/base/sponsors_schema.yml +73 -0
  45. data/_data/base/title_schema.yml +49 -0
  46. data/_data/base/toc_schema.yml +114 -0
  47. data/_data/download/cards.yml +309 -0
  48. data/_data/download/navbar.yml +11 -0
  49. data/_includes/base/announcement.html.liquid +65 -0
  50. data/_includes/base/artwork.html.liquid +63 -0
  51. data/_includes/base/backtotop.html.liquid +73 -0
  52. data/_includes/base/bits.html.liquid +152 -0
  53. data/_includes/base/breadcrumb.html.liquid +77 -0
  54. data/_includes/base/breakingnews.html.liquid +90 -0
  55. data/_includes/base/card.html.liquid +110 -0
  56. data/_includes/base/color-table.html.liquid +33 -0
  57. data/_includes/base/configuration_variables-nested.html.liquid +98 -0
  58. data/_includes/base/configuration_variables.html.liquid +98 -0
  59. data/_includes/base/content.html.liquid +7 -0
  60. data/_includes/base/copyright.html.liquid +70 -0
  61. data/_includes/base/copyvalue.html.liquid +82 -0
  62. data/_includes/base/datatable.html.liquid +83 -0
  63. data/_includes/base/event.html.liquid +105 -0
  64. data/_includes/base/fontawesome.html.liquid +91 -0
  65. data/_includes/base/footer.html.liquid +69 -0
  66. data/_includes/base/head.html.liquid +135 -0
  67. data/_includes/base/heading_anchor.html.liquid +67 -0
  68. data/_includes/base/highlight.html.liquid +84 -0
  69. data/_includes/base/image.html.liquid +42 -0
  70. data/_includes/base/link.html.liquid +129 -0
  71. data/_includes/base/locales.html.liquid +78 -0
  72. data/_includes/base/navbar.html.liquid +121 -0
  73. data/_includes/base/navindex.html.liquid +200 -0
  74. data/_includes/base/ogp.html.liquid +144 -0
  75. data/_includes/base/project.html.liquid +104 -0
  76. data/_includes/base/shortcut.html.liquid +77 -0
  77. data/_includes/base/social.html.liquid +76 -0
  78. data/_includes/base/sponsors-cards.html.liquid +69 -0
  79. data/_includes/base/sponsors-carousel.html.liquid +91 -0
  80. data/_includes/base/title.html.liquid +65 -0
  81. data/_includes/base/toc-generator.html.liquid +189 -0
  82. data/_includes/base/toc.html.liquid +95 -0
  83. data/_includes/download/cards-body-commands.html +7 -0
  84. data/_includes/download/cards-body-convert.html +10 -0
  85. data/_includes/download/cards-body-doc.html +9 -0
  86. data/_includes/download/cards-body-documentation.html +11 -0
  87. data/_includes/download/cards-body-eol.html +16 -0
  88. data/_includes/download/cards-body-mirrors.html +8 -0
  89. data/_includes/download/cards-body-screenshot.html +26 -0
  90. data/_includes/download/cards-body-screenshots.html +32 -0
  91. data/_includes/download/cards-body.html +8 -0
  92. data/_includes/download/cards-footer.html +3 -0
  93. data/_includes/download/cards-header-commands.html +8 -0
  94. data/_includes/download/cards-header-convert.html +8 -0
  95. data/_includes/download/cards-header-doc.html +8 -0
  96. data/_includes/download/cards-header-documentation.html +8 -0
  97. data/_includes/download/cards-header-eol.html +8 -0
  98. data/_includes/download/cards-header-mirrors.html +13 -0
  99. data/_includes/download/cards-header-screenshot.html +8 -0
  100. data/_includes/download/cards-header-screenshots.html +8 -0
  101. data/_includes/download/cards-header.html +13 -0
  102. data/_includes/download/cards.html +120 -0
  103. data/_layouts/base/default.html +68 -0
  104. data/_layouts/download/cards.html +7 -0
  105. data/_layouts/download/default.html +7 -0
  106. data/_layouts/people/default.html +68 -0
  107. data/_sass/base/_customization.scss +331 -0
  108. data/_sass/base/_light-dark.scss +10 -0
  109. data/_sass/base/_maps.scss +104 -0
  110. data/_sass/base/_variables.scss +232 -0
  111. data/_sass/bootstrap/_accordion.scss +153 -0
  112. data/_sass/bootstrap/_alert.scss +68 -0
  113. data/_sass/bootstrap/_badge.scss +38 -0
  114. data/_sass/bootstrap/_breadcrumb.scss +40 -0
  115. data/_sass/bootstrap/_button-group.scss +147 -0
  116. data/_sass/bootstrap/_buttons.scss +216 -0
  117. data/_sass/bootstrap/_card.scss +238 -0
  118. data/_sass/bootstrap/_carousel.scss +226 -0
  119. data/_sass/bootstrap/_close.scss +66 -0
  120. data/_sass/bootstrap/_containers.scss +41 -0
  121. data/_sass/bootstrap/_dropdown.scss +250 -0
  122. data/_sass/bootstrap/_forms.scss +9 -0
  123. data/_sass/bootstrap/_functions.scss +302 -0
  124. data/_sass/bootstrap/_grid.scss +39 -0
  125. data/_sass/bootstrap/_helpers.scss +12 -0
  126. data/_sass/bootstrap/_images.scss +42 -0
  127. data/_sass/bootstrap/_list-group.scss +199 -0
  128. data/_sass/bootstrap/_maps.scss +174 -0
  129. data/_sass/bootstrap/_mixins.scss +42 -0
  130. data/_sass/bootstrap/_modal.scss +240 -0
  131. data/_sass/bootstrap/_nav.scss +197 -0
  132. data/_sass/bootstrap/_navbar.scss +289 -0
  133. data/_sass/bootstrap/_offcanvas.scss +147 -0
  134. data/_sass/bootstrap/_pagination.scss +109 -0
  135. data/_sass/bootstrap/_placeholders.scss +51 -0
  136. data/_sass/bootstrap/_popover.scss +196 -0
  137. data/_sass/bootstrap/_progress.scss +68 -0
  138. data/_sass/bootstrap/_reboot.scss +617 -0
  139. data/_sass/bootstrap/_root.scss +187 -0
  140. data/_sass/bootstrap/_spinners.scss +86 -0
  141. data/_sass/bootstrap/_tables.scss +171 -0
  142. data/_sass/bootstrap/_toasts.scss +73 -0
  143. data/_sass/bootstrap/_tooltip.scss +119 -0
  144. data/_sass/bootstrap/_transitions.scss +27 -0
  145. data/_sass/bootstrap/_type.scss +106 -0
  146. data/_sass/bootstrap/_utilities.scss +806 -0
  147. data/_sass/bootstrap/_variables-dark.scss +102 -0
  148. data/_sass/bootstrap/_variables.scss +1753 -0
  149. data/_sass/bootstrap/bootstrap-grid.scss +62 -0
  150. data/_sass/bootstrap/bootstrap-reboot.scss +10 -0
  151. data/_sass/bootstrap/bootstrap-utilities.scss +19 -0
  152. data/_sass/bootstrap/bootstrap.scss +52 -0
  153. data/_sass/bootstrap/forms/_floating-labels.scss +97 -0
  154. data/_sass/bootstrap/forms/_form-check.scss +189 -0
  155. data/_sass/bootstrap/forms/_form-control.scss +214 -0
  156. data/_sass/bootstrap/forms/_form-range.scss +91 -0
  157. data/_sass/bootstrap/forms/_form-select.scss +80 -0
  158. data/_sass/bootstrap/forms/_form-text.scss +11 -0
  159. data/_sass/bootstrap/forms/_input-group.scss +132 -0
  160. data/_sass/bootstrap/forms/_labels.scss +36 -0
  161. data/_sass/bootstrap/forms/_validation.scss +12 -0
  162. data/_sass/bootstrap/helpers/_clearfix.scss +3 -0
  163. data/_sass/bootstrap/helpers/_color-bg.scss +7 -0
  164. data/_sass/bootstrap/helpers/_colored-links.scss +30 -0
  165. data/_sass/bootstrap/helpers/_focus-ring.scss +5 -0
  166. data/_sass/bootstrap/helpers/_icon-link.scss +25 -0
  167. data/_sass/bootstrap/helpers/_position.scss +36 -0
  168. data/_sass/bootstrap/helpers/_ratio.scss +26 -0
  169. data/_sass/bootstrap/helpers/_stacks.scss +15 -0
  170. data/_sass/bootstrap/helpers/_stretched-link.scss +15 -0
  171. data/_sass/bootstrap/helpers/_text-truncation.scss +7 -0
  172. data/_sass/bootstrap/helpers/_visually-hidden.scss +8 -0
  173. data/_sass/bootstrap/helpers/_vr.scss +8 -0
  174. data/_sass/bootstrap/mixins/_alert.scss +18 -0
  175. data/_sass/bootstrap/mixins/_backdrop.scss +14 -0
  176. data/_sass/bootstrap/mixins/_banner.scss +7 -0
  177. data/_sass/bootstrap/mixins/_border-radius.scss +78 -0
  178. data/_sass/bootstrap/mixins/_box-shadow.scss +24 -0
  179. data/_sass/bootstrap/mixins/_breakpoints.scss +127 -0
  180. data/_sass/bootstrap/mixins/_buttons.scss +70 -0
  181. data/_sass/bootstrap/mixins/_caret.scss +69 -0
  182. data/_sass/bootstrap/mixins/_clearfix.scss +9 -0
  183. data/_sass/bootstrap/mixins/_color-mode.scss +21 -0
  184. data/_sass/bootstrap/mixins/_color-scheme.scss +7 -0
  185. data/_sass/bootstrap/mixins/_container.scss +11 -0
  186. data/_sass/bootstrap/mixins/_deprecate.scss +10 -0
  187. data/_sass/bootstrap/mixins/_forms.scss +163 -0
  188. data/_sass/bootstrap/mixins/_gradients.scss +47 -0
  189. data/_sass/bootstrap/mixins/_grid.scss +151 -0
  190. data/_sass/bootstrap/mixins/_image.scss +16 -0
  191. data/_sass/bootstrap/mixins/_list-group.scss +26 -0
  192. data/_sass/bootstrap/mixins/_lists.scss +7 -0
  193. data/_sass/bootstrap/mixins/_pagination.scss +10 -0
  194. data/_sass/bootstrap/mixins/_reset-text.scss +17 -0
  195. data/_sass/bootstrap/mixins/_resize.scss +6 -0
  196. data/_sass/bootstrap/mixins/_table-variants.scss +24 -0
  197. data/_sass/bootstrap/mixins/_text-truncate.scss +8 -0
  198. data/_sass/bootstrap/mixins/_transition.scss +26 -0
  199. data/_sass/bootstrap/mixins/_utilities.scss +97 -0
  200. data/_sass/bootstrap/mixins/_visually-hidden.scss +38 -0
  201. data/_sass/bootstrap/utilities/_api.scss +47 -0
  202. data/_sass/bootstrap/vendor/_rfs.scss +348 -0
  203. data/assets/css/base/stylesheet.min.scss +35 -0
  204. data/assets/icons/android-chrome-192.png +0 -0
  205. data/assets/icons/android-chrome-512.png +0 -0
  206. data/assets/icons/apple-touch-icon.png +0 -0
  207. data/assets/icons/favicon-16.png +0 -0
  208. data/assets/icons/favicon-32.png +0 -0
  209. data/assets/icons/favicon.ico +0 -0
  210. data/assets/icons/favicon.svg +1 -0
  211. data/assets/img/anaconda-symbolic.svg +1 -0
  212. data/assets/img/anaconda.svg +1 -0
  213. data/assets/img/base/centos-colors.gpl +55 -0
  214. data/assets/img/base/example-ogp-image.svg +297 -0
  215. data/assets/img/base/example-sponsors-design.svg +226 -0
  216. data/assets/img/base/example-sponsors-logo-1.svg +120 -0
  217. data/assets/img/base/example-sponsors-logo-2.svg +116 -0
  218. data/assets/img/base/example-sponsors-logo-3.svg +123 -0
  219. data/assets/img/base/example-sponsors-logo-4.svg +116 -0
  220. data/assets/img/base/example-sponsors-logo-5.svg +116 -0
  221. data/assets/img/base/example-sponsors-logo-6.svg +116 -0
  222. data/assets/img/base/example-sponsors-logo-7.svg +116 -0
  223. data/assets/img/base/example-sponsors-logo-8.svg +110 -0
  224. data/assets/img/base/page-layout-default.svg +1217 -0
  225. data/assets/img/base/page-with-alert.svg +383 -0
  226. data/assets/img/base/page-with-announcement.svg +956 -0
  227. data/assets/img/base/page-with-artwork.svg +1009 -0
  228. data/assets/img/base/page-with-backtotop.svg +1009 -0
  229. data/assets/img/base/page-with-bits.svg +891 -0
  230. data/assets/img/base/page-with-breadcrumb.svg +676 -0
  231. data/assets/img/base/page-with-breakingnews.svg +957 -0
  232. data/assets/img/base/page-with-color.svg +57 -0
  233. data/assets/img/base/page-with-copyright.svg +1018 -0
  234. data/assets/img/base/page-with-copyvalue.svg +57 -0
  235. data/assets/img/base/page-with-datatable.svg +857 -0
  236. data/assets/img/base/page-with-event.svg +518 -0
  237. data/assets/img/base/page-with-fontawesome.svg +147 -0
  238. data/assets/img/base/page-with-footer.svg +1018 -0
  239. data/assets/img/base/page-with-heading.svg +57 -0
  240. data/assets/img/base/page-with-highlight.svg +86 -0
  241. data/assets/img/base/page-with-image.svg +57 -0
  242. data/assets/img/base/page-with-link.svg +57 -0
  243. data/assets/img/base/page-with-locales.svg +1009 -0
  244. data/assets/img/base/page-with-navbar.svg +958 -0
  245. data/assets/img/base/page-with-navindex.svg +279 -0
  246. data/assets/img/base/page-with-ogp.svg +401 -0
  247. data/assets/img/base/page-with-project.svg +423 -0
  248. data/assets/img/base/page-with-shortcut.svg +937 -0
  249. data/assets/img/base/page-with-social.svg +937 -0
  250. data/assets/img/base/page-with-sponsors.svg +937 -0
  251. data/assets/img/base/page-with-title.svg +584 -0
  252. data/assets/img/base/page-with-toc.svg +399 -0
  253. data/assets/img/base/screenshot-1200x600.svg +114 -0
  254. data/assets/img/centos-dynamicmsg-logo.svg +1 -0
  255. data/assets/img/centos-dynamicmsg-type.svg +1 -0
  256. data/assets/img/centos-dynamicmsg-whitelogo.svg +1 -0
  257. data/assets/img/centos-dynamicmsg-whitetype.svg +1 -0
  258. data/assets/img/centos-gdm-whitelogo.svg +1 -0
  259. data/assets/img/centos-ipa-whiteheader.svg +1 -0
  260. data/assets/img/centos-logo-2bits.svg +1 -0
  261. data/assets/img/centos-logo.svg +1 -0
  262. data/assets/img/centos-message-logo.svg +1 -0
  263. data/assets/img/centos-motif.png +0 -0
  264. data/assets/img/centos-poweredby-logo.svg +1 -0
  265. data/assets/img/centos-social-share.png +0 -0
  266. data/assets/img/centos-symbol-2bits.svg +1 -0
  267. data/assets/img/centos-symbol.svg +1 -0
  268. data/assets/img/centos-type.svg +1 -0
  269. data/assets/img/centos-vertical-logo.svg +1 -0
  270. data/assets/img/centos-vertical-message-logo.svg +1 -0
  271. data/assets/img/centos-whitelogo.svg +1 -0
  272. data/assets/img/download/centos-linux-7-2009-screenshot-n.png +0 -0
  273. data/assets/img/download/centos-stream-8-screenshot-n.png +0 -0
  274. data/assets/img/download/centos-stream-9-screenshot-n.png +0 -0
  275. data/assets/img/download/distribution-release-screenshot-1.png +0 -0
  276. data/assets/img/download/distribution-release-screenshot-2.png +0 -0
  277. data/assets/img/download/distribution-release-screenshot-3.png +0 -0
  278. data/assets/img/download/distribution-release-screenshot-n.png +0 -0
  279. data/assets/img/download/distribution-release-screenshot-n.svg +134 -0
  280. data/assets/img/download/download.svg +421 -0
  281. data/assets/img/download/fig-the-downloads-cards-presentation-template.png +0 -0
  282. data/assets/img/people/page.svg +900 -0
  283. data/assets/img/people/page.webp +0 -0
  284. data/assets/img/people/username.webp +0 -0
  285. data/assets/js/base/backtotop.js +20 -0
  286. data/assets/js/base/copyvalue.js +145 -0
  287. data/assets/js/base/datatable.js +41 -0
  288. data/assets/js/base/heading-anchor.js +108 -0
  289. data/assets/js/base/highlight.js +12 -0
  290. data/assets/js/base/init-tooltips.js +12 -0
  291. data/assets/js/bootstrap.bundle.js +6312 -0
  292. data/assets/js/bootstrap.bundle.js.map +1 -0
  293. data/assets/js/bootstrap.bundle.min.js +7 -0
  294. data/assets/js/bootstrap.bundle.min.js.map +1 -0
  295. data/assets/js/bootstrap.esm.js +4447 -0
  296. data/assets/js/bootstrap.esm.js.map +1 -0
  297. data/assets/js/bootstrap.esm.min.js +7 -0
  298. data/assets/js/bootstrap.esm.min.js.map +1 -0
  299. data/assets/js/bootstrap.js +4494 -0
  300. data/assets/js/bootstrap.js.map +1 -0
  301. data/assets/js/bootstrap.min.js +7 -0
  302. data/assets/js/bootstrap.min.js.map +1 -0
  303. data/site.webmanifest +11 -0
  304. metadata +611 -0
@@ -0,0 +1,200 @@
1
+ {% comment %}
2
+ ================================================================================
3
+ Template: Navigation Index Component
4
+ Purpose: Renders a collection of pages or components in multiple display formats.
5
+ Provides flexible list/card/table views for indexes and inventories.
6
+ Automatically filters data by current page locale to avoid duplicates.
7
+ ================================================================================
8
+
9
+ Design Logic:
10
+ - Multi-format output: card, text, list, table, component_table (default: list)
11
+ - Filters data by locale: shows canonical pages for English, localized variants for other locales
12
+ - Filters out current page from results (prevents self-linking)
13
+ - Reusable link component for consistent styling
14
+ - Optional filename display using page name (with .md stripped)
15
+ - Component table with status indicators from site.defaults
16
+ - DataTables integration for searchable/sortable table output
17
+
18
+ Required Inputs:
19
+ - data: Array of page or component objects to display
20
+
21
+ Optional Inputs:
22
+ - format: Output format: 'card' | 'text' | 'list' | 'table' | 'component_table'
23
+ - show_page_filename: Display page filename instead of title (true/false)
24
+
25
+ Data Object Properties:
26
+ - name, title, url, title_lead: Common properties
27
+ - component.name: Component identifier (for component_table format)
28
+ - locale: Locale code for localized pages (set by localization plugin)
29
+ ================================================================================
30
+ {% endcomment %}
31
+
32
+ {%- assign with_navindex = include.with_navindex
33
+ | default: page.with_navindex
34
+ %}
35
+
36
+ {%- assign with_navindex_data = include.data
37
+ | default: page.with_navindex_data
38
+ | default: site.data.navindex
39
+ | default: site.data.base.navindex
40
+ %}
41
+
42
+ {%- assign with_navindex_schema = site.data.base.navindex_schema.properties.with_navindex_data.properties %}
43
+
44
+ {% assign data = include.data | default: with_navindex_schema.data.default %}
45
+ {% assign format = include.format | default: with_navindex_schema.format.default %}
46
+
47
+ {%- comment %} Filter data by locale to show only matching language pages {%- endcomment %}
48
+ {%- assign current_locale = page.locale | default: 'en' %}
49
+ {%- assign filtered_data = '' | split: '' %}
50
+
51
+ {%- for item in data %}
52
+ {%- assign item_locale = item.locale | default: 'en' %}
53
+
54
+ {%- if current_locale == 'en' %}
55
+ {%- comment %} For English pages, show only canonical pages (not localized variants) {%- endcomment %}
56
+ {%- if item.localized != true %}
57
+ {%- assign filtered_data = filtered_data | push: item %}
58
+ {%- endif %}
59
+ {%- else %}
60
+ {%- comment %} For localized pages, show only pages matching current locale {%- endcomment %}
61
+ {%- if item_locale == current_locale %}
62
+ {%- assign filtered_data = filtered_data | push: item %}
63
+ {%- endif %}
64
+ {%- endif %}
65
+ {%- endfor %}
66
+
67
+ {%- comment %} Use filtered data for rendering {%- endcomment %}
68
+ {%- assign data = filtered_data %}
69
+
70
+ {% capture card %}
71
+ {% assign show_page_filename = include.show_page_filename | default: "false" %}
72
+ <div class="row g-3 mb-3 pt-1">
73
+ {%- for item in data %}
74
+ {%- if item.title != page.title %}
75
+ <div class="col-12 col-md-6">
76
+ <div class="p-3 pb-1 bg-light border rounded">
77
+ <div class="h5">
78
+ {%- if show_page_filename == "true" %}
79
+ {%- assign item_name = item.name | remove: '.md' %}
80
+ {%- include base/link.html.liquid name=item_name link=item.url %}
81
+ {%- else %}
82
+ {%- include base/link.html.liquid name=item.title link=item.url %}
83
+ {%- endif %}
84
+ </div>
85
+ {%- if item.title_lead %}
86
+ <p class="mb-3">{{ item.title_lead }}</p>
87
+ {%- endif %}
88
+ </div>
89
+ </div>
90
+ {%- endif %}
91
+ {%- endfor %}
92
+ </div>
93
+ {%- endcapture %}
94
+
95
+ {%- capture text %}
96
+ {% assign show_page_filename = include.show_page_filename | default: "false" %}
97
+ <div class="row g-3 mb-3 pt-1">
98
+ {%- for item in data %}
99
+ {%- if item.title != page.title %}
100
+ <div class="col-12 col-md-6">
101
+ {%- if show_page_filename == "true" %}
102
+ {%- assign item_name = item.name | remove: '.md' %}
103
+ {%- include base/link.html.liquid name=item_name link=item.url %}
104
+ {%- else %}
105
+ {%- include base/link.html.liquid name=item.title link=item.url %}
106
+ {%- endif %}
107
+ </div>
108
+ {%- endif %}
109
+ {%- endfor %}
110
+ </div>
111
+ {%- endcapture %}
112
+
113
+ {%- capture list %}
114
+ {% assign show_page_filename = include.show_page_filename | default: "false" %}
115
+ <ul>
116
+ {%- for item in data %}
117
+ {%- if item.title != page.title %}
118
+ {%- if show_page_filename == "true" %}
119
+ {%- 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>
121
+ {%- 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>
123
+ {%- endif %}
124
+ {%- endif %}
125
+ {%- endfor %}
126
+ </ul>
127
+ {%- endcapture %}
128
+
129
+ {% capture table %}
130
+ {% assign show_page_filename = include.show_page_filename | default: "false" %}
131
+ <table class="table dataTable">
132
+ <thead class="table-light">
133
+ <tr>
134
+ <th>Name</th>
135
+ <th>Description</th>
136
+ </tr>
137
+ </thead>
138
+ <tbody>
139
+ {%- for item in data %}
140
+ <tr>
141
+ {%- if item.title != page.title %}
142
+ {%- if show_page_filename == "true" %}
143
+ {%- assign item_name = item.name | remove: '.md' %}
144
+ <td>{% include base/link.html.liquid name=item_name link=item.url %}</td>
145
+ {%- else %}
146
+ <td>{% include base/link.html.liquid name=item.title link=item.url %}</td>
147
+ {%- endif %}
148
+ {%- endif %}
149
+ <td>{{ item.title_lead }}</td>
150
+ </tr>
151
+ {%- endfor %}
152
+ </tbody>
153
+ </table>
154
+ {%- endcapture %}
155
+
156
+ {% capture component_table %}
157
+ <table class="table dataTable">
158
+ <thead class="table-light">
159
+ <tr>
160
+ <th>Name</th>
161
+ <th>Status</th>
162
+ <th>Description</th>
163
+ </tr>
164
+ </thead>
165
+ <tbody>
166
+ {%- for item in data %}
167
+ {% comment %} Get component status from site configuration file {% endcomment %}
168
+ {%- assign status_name = "with_" | append: item.component.name %}
169
+ {%- assign status = site.defaults[1].values[status_name] %}
170
+ {% comment %} Render component status {% endcomment %}
171
+ {%- if status == true %}
172
+ {%- assign status_icon = '<span data-bs-toggle="tooltip" data-bs-title="This component is enabled globally and can be used on all site pages. It can be disabled either globally or at a page level."><i class="fa-solid fa-toggle-on text-success"></i> Enabled</span>' %}
173
+ {%- elsif status == false %}
174
+ {%- assign status_icon = '<span data-bs-toggle="tooltip" data-bs-title="This component is disabled globally and cannot be used in site pages. It can be enabled either globally or at a page level."><i class="fa-solid fa-toggle-off text-danger"></i> Disabled</span>' %}
175
+ {%- else %}
176
+ {%- assign status_icon = '<span data-bs-toggle="tooltip" data-bs-title="This component is enabled globally and can be used on all site pages. It cannot be disabled."><i class="fa-solid fa-toggle-on text-light"></i> Internal</span>' %}
177
+ {%- endif %}
178
+ {% comment %} Render table rows {% endcomment %}
179
+ <tr>
180
+ <td>{% include base/link.html.liquid name=item.component.name link=item.url %}</td>
181
+ <td class="text-nowrap">{{ status_icon }}</td>
182
+ <td>{{ item.title_lead }}</td>
183
+ </tr>
184
+ {%- endfor %}
185
+ </tbody>
186
+ </table>
187
+ {% endcapture %}
188
+
189
+ {% case format %}
190
+ {% when "card" %}
191
+ {{ card }}
192
+ {% when "text" %}
193
+ {{ text }}
194
+ {% when "table" %}
195
+ {{ table }}
196
+ {% when "component_table" %}
197
+ {{ component_table }}
198
+ {% else %}
199
+ {{ list }}
200
+ {% endcase %}
@@ -0,0 +1,144 @@
1
+ {% comment %}
2
+ ================================================================================
3
+ Template: Open Graph & Twitter Meta Tags Component
4
+ Purpose: Renders meta tags for Open Graph (OG) and Twitter Card protocols.
5
+ Enables proper social media previews when sharing on social platforms.
6
+ ================================================================================
7
+
8
+ Design Logic:
9
+ - Dual-protocol support: Open Graph (OG) and Twitter Card meta tags
10
+ - Hierarchical fallback system for meta tag values
11
+ - Per-property customization via page front matter
12
+ - Conditional rendering of protocol-specific attributes
13
+ - Image metadata with security URL and dimensions for OG
14
+
15
+ Required Inputs:
16
+ - page.title: Page title for social sharing preview
17
+ - site.url: Full site URL (for absolute URLs)
18
+ - site.baseurl: Base URL path prefix
19
+
20
+ Optional Inputs:
21
+ - with_ogp_data.og.*, with_ogp_data.twitter.*: OG/Twitter property overrides
22
+ - page.excerpt, page.title_lead: Fallback for description
23
+ - site.description: Site-level description fallback
24
+ - page.locale: BCP 47 locale code set by jekyll-l10n on localized pages
25
+
26
+ Data Source Hierarchy:
27
+ - og:type: with_ogp_data.og.type → schema default → 'website'
28
+ - og:site_name: with_ogp_data.og.site_name → site.title
29
+ - og:logo: with_ogp_data.og.logo → schema default → '/assets/icons/apple-touch-icon.png'
30
+ - og:locale: page.locale (jekyll-l10n) → with_ogp_data.locale → schema default → 'en_US'
31
+ - og:image:type: with_ogp_data.og.image.type → schema default → 'image/png'
32
+ - og:image:width: with_ogp_data.og.image.width → schema default → 1200
33
+ - og:image:height: with_ogp_data.og.image.height → schema default → 630
34
+ - og:image:alt: with_ogp_data[property].image.alt → schema default → 'The CentOS Project'
35
+ - twitter:card: with_ogp_data.twitter.card → schema default → 'summary_large_image'
36
+ - twitter:site: with_ogp_data.twitter.site → schema default → '@CentOS'
37
+ - twitter:creator: with_ogp_data.twitter.creator → schema default → '@CentOS'
38
+ - Default image path: /assets/img/centos-social-share.png
39
+ ================================================================================
40
+ {% endcomment %}
41
+
42
+ {%- assign with_ogp = include.with_ogp
43
+ | default: page.with_ogp
44
+ %}
45
+
46
+ {%- assign with_ogp_data = include.data
47
+ | default: page.with_ogp_data
48
+ | default: site.data.ogp
49
+ | default: site.data.base.ogp
50
+ %}
51
+
52
+ {%- assign with_ogp_schema = site.data.base.ogp_schema.properties.with_ogp_data.properties %}
53
+
54
+ {%- if with_ogp %}
55
+
56
+ {%- comment %} === Presentation === {% endcomment %}
57
+ {%- comment %} --- Schema shorthands --- {% endcomment %}
58
+ {%- assign with_ogp_og_image_schema = with_ogp_schema.og.properties.image.properties %}
59
+ {%- assign with_ogp_twitter_schema = with_ogp_schema.twitter.properties %}
60
+
61
+ {%- comment %} --- Shared image metadata (og and twitter use the same image) --- {% endcomment %}
62
+ {%- assign ogp_image_type = with_ogp_data.og.image.type | default: with_ogp_og_image_schema.type.default | default: 'image/png' %}
63
+ {%- assign ogp_image_width = with_ogp_data.og.image.width | default: with_ogp_og_image_schema.width.default | default: 1200 %}
64
+ {%- assign ogp_image_height = with_ogp_data.og.image.height | default: with_ogp_og_image_schema.height.default | default: 630 %}
65
+
66
+ {%- comment %} --- Defaults --- {% endcomment %}
67
+ {%- assign ogp_og_type = with_ogp_data.og.type | default: with_ogp_schema.og.properties.type.default %}
68
+ {%- assign ogp_locale = page.locale | default: with_ogp_data.locale | default: with_ogp_schema.locale.default | default: 'en_US' %}
69
+ {%- assign ogp_twitter_card = with_ogp_data.twitter.card
70
+ | default: with_ogp_twitter_schema.card.default
71
+ | default: 'summary_large_image' %}
72
+ {%- assign ogp_twitter_site = with_ogp_data.twitter.site
73
+ | default: with_ogp_twitter_schema.site.default
74
+ | default: '@CentOS' %}
75
+ {%- assign ogp_twitter_creator = with_ogp_data.twitter.creator
76
+ | default: with_ogp_twitter_schema.creator.default
77
+ | default: '@CentOS' %}
78
+
79
+ {%- comment %} --- Common attributes for both `og` and `twitter` properties --- {% endcomment %}
80
+ {%- assign properties = "og,twitter" | split: "," %}
81
+ {%- for property in properties %}
82
+ {%- if property == "twitter" %}{%- assign meta_attr = "name" %}{%- else %}{%- assign meta_attr = "property" %}{%- endif %}
83
+
84
+ {%- comment %} --- Twitter Card: required first --- {% endcomment %}
85
+ {%- if property == "twitter" %}
86
+ <meta name="twitter:card" content="{{ ogp_twitter_card }}" />
87
+ <meta name="twitter:site" content="{{ ogp_twitter_site }}" />
88
+ <meta name="twitter:creator" content="{{ ogp_twitter_creator }}" />
89
+ {%- endif %}
90
+
91
+ {%- comment %} --- Title --- {% endcomment %}
92
+ {%- if with_ogp_data[property].title %}
93
+ <meta {{ meta_attr }}="{{ property }}:title" content="{{ page.title }}" />
94
+ {%- endif %}
95
+
96
+ {%- comment %} --- OG type and logo (after title, before url) --- {% endcomment %}
97
+ {%- if property == "og" %}
98
+ <meta property="og:type" content="{{ ogp_og_type }}" />
99
+ {%- assign ogp_logo = with_ogp_data.og.logo | default: with_ogp_schema.og.properties.logo.default %}
100
+ {%- if ogp_logo %}
101
+ <meta property="og:logo" content="{{ site.url }}{{ site.baseurl }}{{ ogp_logo }}" />
102
+ {%- endif %}
103
+ {%- endif %}
104
+
105
+ {%- comment %} --- URL --- {% endcomment %}
106
+ {%- if with_ogp_data[property].url %}
107
+ <meta {{ meta_attr }}="{{ property }}:url" content="{{ site.url }}{{ site.baseurl }}{{ page.url }}" />
108
+ {%- endif %}
109
+
110
+ {%- comment %} --- Description --- {% endcomment %}
111
+ {%- if with_ogp_data[property].description %}
112
+ {%- if page.excerpt %}
113
+ <meta {{ meta_attr }}="{{ property }}:description" content="{{ page.excerpt }}" />
114
+ {%- elsif page.title_lead %}
115
+ <meta {{ meta_attr }}="{{ property }}:description" content="{{ page.title_lead }}" />
116
+ {%- else %}
117
+ <meta {{ meta_attr }}="{{ property }}:description" content="{{ site.description }}" />
118
+ {%- endif %}
119
+ {%- endif %}
120
+
121
+ {%- comment %} --- Image --- {% endcomment %}
122
+ {%- if with_ogp_data[property].image %}
123
+ <meta {{ meta_attr }}="{{ property }}:image" content="{{ site.url }}{{ site.baseurl }}/assets/img/centos-social-share.png" />
124
+ {%- if property == "og" %}
125
+ <meta {{ meta_attr }}="{{ property }}:image:secure_url" content="{{ site.url }}{{ site.baseurl }}/assets/img/centos-social-share.png" />
126
+ <meta {{ meta_attr }}="{{ property }}:image:type" content="{{ ogp_image_type }}" />
127
+ <meta {{ meta_attr }}="{{ property }}:image:width" content="{{ ogp_image_width }}" />
128
+ <meta {{ meta_attr }}="{{ property }}:image:height" content="{{ ogp_image_height }}" />
129
+ {%- endif %}
130
+ <meta {{ meta_attr }}="{{ property }}:image:alt" content="{{ with_ogp_data[property].image.alt | default: with_ogp_og_image_schema.alt.default | default: 'The CentOS Project' }}" />
131
+ {%- endif %}
132
+
133
+ {%- comment %} --- OG site_name and locale (after image) --- {% endcomment %}
134
+ {%- if property == "og" %}
135
+ {%- assign ogp_site_name = with_ogp_data.og.site_name | default: site.title %}
136
+ {%- if ogp_site_name %}
137
+ <meta property="og:site_name" content="{{ ogp_site_name }}" />
138
+ {%- endif %}
139
+ <meta property="og:locale" content="{{ ogp_locale }}" />
140
+ {%- endif %}
141
+
142
+ {%- endfor %}
143
+
144
+ {% endif %}
@@ -0,0 +1,104 @@
1
+ {% comment %}
2
+ ================================================================================
3
+ Template: Project Showcase Component
4
+ Purpose: Renders a full-width project/product hero section with featured
5
+ content and supplementary resource links.
6
+ ================================================================================
7
+
8
+ Design Logic:
9
+ - Hero-style layout: full-width container with dark background
10
+ - Wraps card component for flexible content presentation
11
+ - Dark theme (text-bg-dark) for high contrast and visual prominence
12
+ - Resource section for downloadable/related content links
13
+ - Data source hierarchy enables both page-level and site-level config
14
+ - Container-based layout for max-width constraint on large screens
15
+ - Reuses link component for action and resource buttons
16
+
17
+ Optional Inputs:
18
+ - data: Project data object (overrides all fallbacks)
19
+ - project.name, description, icon, image, screenshot: Content
20
+ - project.actions, resources: Arrays of buttons [{name, url, icon}]
21
+
22
+ Data Source Hierarchy (priority):
23
+ 1. include.data
24
+ 2. page.with_project_data
25
+ 3. site.data.project
26
+ 4. site.data.base.project
27
+ ================================================================================
28
+ {% endcomment %}
29
+
30
+ {%- assign with_project = include.with_project
31
+ | default: page.with_project
32
+ %}
33
+
34
+ {%- assign with_project_data = include.data
35
+ | default: page.with_project_data
36
+ | default: site.data.project
37
+ | default: site.data.base.project
38
+ %}
39
+
40
+ {%- assign with_project_schema = site.data.base.project_schema.properties.with_project_data.properties %}
41
+
42
+ {%- if with_project -%}
43
+
44
+ {% assign project_class = with_project_data.class | default: with_project_schema.class.default %}
45
+ {% assign project_screenshot = with_project_data.screenshot | default: with_project_schema.screenshot.default %}
46
+ {% assign project_screenshot_class = with_project_data.screenshot_class | default: with_project_schema.screenshot_class.default %}
47
+ {% assign project_screenshot_alt = with_project_data.screenshot_alt | default: with_project_schema.screenshot_alt.default %}
48
+ {% assign project_image = with_project_data.image | default: with_project_schema.image.default %}
49
+ {% assign project_image_alt = with_project_data.image_alt | default: with_project_schema.image_alt.default %}
50
+ {% assign project_image_class = with_project_data.image_class | default: with_project_schema.image_class.default %}
51
+ {% assign project_image_style = with_project_data.image_style | default: with_project_schema.image_style.default %}
52
+ {% assign project_icon = with_project_data.icon | default: with_project_schema.icon.default %}
53
+ {% assign project_icon_class = with_project_data.icon_class | default: with_project_schema.icon_class.default %}
54
+ {% assign project_name = with_project_data.name | default: with_project_schema.name.default %}
55
+ {% assign project_name_class = with_project_data.name_class | default: with_project_schema.name_class.default %}
56
+ {% assign project_description = with_project_data.description | default: with_project_schema.description.default %}
57
+ {% assign project_description_class = with_project_data.description_class | default: with_project_schema.description_class.default %}
58
+ {% assign project_actions = with_project_data.actions | default: with_project_schema.actions.default %}
59
+ {% assign project_actions_class = with_project_data.actions_class | default: with_project_schema.actions_class.default %}
60
+ {% assign project_actions_btn_class = with_project_data.actions_btn_class | default: with_project_schema.actions_btn_class.default %}
61
+ {% assign project_resources = with_project_data.resources | default: with_project_schema.resources.default %}
62
+ {% assign project_resources_class = with_project_data.resources_class | default: with_project_schema.resources_class.default %}
63
+ {% assign project_resources_btn_class = with_project_data.resources_btn_class | default: with_project_schema.resources_btn_class.default %}
64
+
65
+ <div class="d-flex{% if project_class != "" %} {{ project_class }}{% endif %}">
66
+ <div class="container pt-5">
67
+ {% include base/card.html.liquid
68
+ class = "flex-column align-items-center pb-3"
69
+ color = "primary"
70
+ screenshot = project_screenshot
71
+ screenshot_class = project_screenshot_class
72
+ screenshot_alt = project_screenshot_alt
73
+ image = project_image
74
+ image_class = project_image_class
75
+ image_style = project_image_style
76
+ image_alt = project_image_alt
77
+ icon = project_icon
78
+ icon_class = project_icon_class
79
+ name = project_name
80
+ name_class = project_name_class
81
+ description = project_description
82
+ description_class = project_description_class
83
+ actions = project_actions
84
+ actions_btn_class = project_actions_btn_class
85
+ actions_class = project_actions_class
86
+ %}
87
+ {%- if project_resources.size > 0 %}
88
+ <div class="d-grid{% if project_resources_class %} {{ project_resources_class }}{% endif %}">
89
+ {%- for resource in project_resources %}
90
+ {% include base/link.html.liquid
91
+ class = project_resources_btn_class
92
+ role = "button"
93
+ name = resource.name
94
+ link = resource.link
95
+ icon = resource.icon
96
+ icon_position = resource.icon_position
97
+ %}
98
+ {%- endfor %}
99
+ </div>
100
+ {%- endif %}
101
+ </div>
102
+ </div>
103
+
104
+ {%- endif -%}
@@ -0,0 +1,77 @@
1
+ {% comment %}
2
+ ================================================================================
3
+ Template: Shortcuts Navigation Component
4
+ Purpose: Renders footer navigation shortcuts grouped by category. Displays
5
+ sections of related links in multi-column layout suitable for footer placement.
6
+ ================================================================================
7
+
8
+ Strategic Design Logic:
9
+ - Grouped navigation: categories of related links
10
+ - Column layout: multi-column footer display
11
+ - Filtered items: only shows items with visible_on='footer'
12
+ - Reusable link component: consistent styling
13
+ - Empty state handling: no output if no items
14
+ - Category headings: uppercase section titles
15
+
16
+ Required Inputs (from data objects):
17
+ - navitems[]: Array with visible_on='footer'
18
+
19
+ Optional Inputs (from include):
20
+ - data: Shortcuts configuration object
21
+
22
+ Data Source Hierarchy (in priority order):
23
+ 1. include.data - Explicitly passed configuration
24
+ 2. page.with_shortcut_data - Page front matter
25
+ 3. site.data.shortcut - Site configuration
26
+ 4. site.data.base.shortcut - Theme defaults
27
+
28
+ Conditional Logic:
29
+ - shortcut_navitems.size > 0: Only render if items exist
30
+ - Loop through sections and their menus
31
+ - Each item rendered as link via link component
32
+ - Color: "light" (suitable for dark footers)
33
+ ================================================================================
34
+ {% endcomment %}
35
+
36
+ {%- assign with_shortcut = include.with_shortcut
37
+ | default: page.with_shortcut
38
+ %}
39
+
40
+ {%- assign with_shortcut_data = include.data
41
+ | default: page.with_shortcut_data
42
+ | default: page.with_navbar_data
43
+ | default: site.data.shortcut
44
+ | default: site.data.navbar
45
+ | default: site.data.base.shortcut
46
+ | default: site.data.base.navbar
47
+ %}
48
+
49
+ {%- assign shortcut_navitems = with_shortcut_data.navitems | where: "visible_on", "footer" %}
50
+
51
+ {%- if with_shortcut -%}
52
+
53
+ {%- comment %} === Presentation === {% endcomment %}
54
+ {% if shortcut_navitems.size > 0 %}
55
+ <div class="d-flex flex-wrap justify-content-evenly mb-4">
56
+
57
+ {% for section in shortcut_navitems -%}
58
+ <div class="pe-4">
59
+ <p class="h6">{% if section.icon %}<i class="{{ section.icon }} me-1"></i>{% endif %}{{ section.name }}</p>
60
+ <ul class="px-0 mb-4">
61
+ {% for item in section.menu -%}
62
+ {%- assign item_link = item.link | locale_url: page.locale %}
63
+ <li class="list-unstyled my-1">
64
+ {% include base/link.html.liquid
65
+ name = item.name
66
+ link = item_link
67
+ color = "primary"
68
+ %}
69
+ </li>
70
+ {% endfor %}
71
+ </ul>
72
+ </div>
73
+ {% endfor %}
74
+ </div>
75
+ {% endif %}
76
+
77
+ {%- endif -%}
@@ -0,0 +1,76 @@
1
+ {% comment %}
2
+ ================================================================================
3
+ Template: Social Links Component
4
+ Purpose: Renders a collection of social media and external links as styled
5
+ buttons with icons. Includes optional site description header.
6
+ ================================================================================
7
+
8
+ Strategic Design Logic:
9
+ - Multi-level data source hierarchy for flexible configuration
10
+ - Site description display for context/branding purposes
11
+ - Link rendering via reusable link component with icon support
12
+ - Icon-based visual identification for different platforms
13
+ - Accessibility-first approach with proper ARIA labels
14
+ - Centered layout for prominent footer or banner placement
15
+
16
+ Required Fields (per item in the media array):
17
+ - link: URL for the social media or external platform
18
+ - icon: Icon class for Font Awesome (e.g., 'fa-brands fa-github')
19
+ - name: Platform name for accessibility label (e.g., 'GitHub')
20
+
21
+ Optional Inputs (from include):
22
+ - data: Array of social link objects (overrides all fallbacks)
23
+
24
+ Optional Inputs (from site configuration):
25
+ - site.description: Brief site description displayed above social links
26
+
27
+ Data Source Hierarchy (in priority order):
28
+ 1. include.data - Explicitly passed social link array
29
+ 2. page.with_social_data - Page front matter configuration
30
+ 3. site.data.social - Site-specific social configuration
31
+ 4. site.data.base.social - Theme default social links
32
+
33
+ Conditional Logic:
34
+ - Site description displays only if site.description is defined
35
+ - Loops through all social links in resolved data source
36
+ - Each link rendered with consistent button styling
37
+ ================================================================================
38
+ {% endcomment %}
39
+
40
+ {%- assign with_social = include.with_social
41
+ | default: page.with_social
42
+ %}
43
+
44
+ {%- assign with_social_data = include.data
45
+ | default: page.with_social_data
46
+ | default: site.data.social
47
+ | default: site.data.base.social
48
+ %}
49
+
50
+ {%- assign with_social_schema = site.data.base.social_schema.properties.with_social_data.properties %}
51
+
52
+ {%- assign social_class = with_social_data.class | default: with_social_schema.class.default %}
53
+ {%- assign social_preamble = with_social_data.preamble | default: with_social_schema.preamble.default %}
54
+ {%- assign social_preamble_class = with_social_data.preamble_class | default: with_social_schema.preamble_class.default %}
55
+ {%- assign social_media = with_social_data.media | default: with_social_schema.media.default %}
56
+
57
+ {% if with_social %}
58
+
59
+ {%- comment %} === Presentation (Begin) === {% endcomment %}
60
+ {%- if social_preamble %}
61
+ <p class="{{ social_preamble_class }}">{{ social_preamble }}</p>
62
+ {%- endif %}
63
+
64
+ {%- for item in social_media -%}
65
+ {%- include base/link.html.liquid
66
+ class = "btn btn-outline-primary m-1"
67
+ link = item.link
68
+ role = "button"
69
+ icon = item.icon
70
+ aria_label = item.name
71
+ data_bs_title = item.name
72
+ %}
73
+ {%- endfor %}
74
+ {%- comment %} === Presentation (End) === {% endcomment %}
75
+
76
+ {% endif %}
@@ -0,0 +1,69 @@
1
+ {% comment %}
2
+ ================================================================================
3
+ Template: Sponsors Cards Component
4
+ Purpose: Renders sponsor logos as a horizontal row of linked cards with
5
+ border styling. Suitable for inline or content-area placement.
6
+ ================================================================================
7
+
8
+ Strategic Design Logic:
9
+ - Multi-level data source hierarchy for flexible configuration
10
+ - Card-based layout for content-area or inline sponsor display
11
+ - Active-flag filtering to soft-delete without data removal
12
+
13
+ Required Fields (per item in the members array):
14
+ - name: Sponsor display name (used as alt text)
15
+ - image: Logo source — bare filename (resolved via image_base_path) or absolute URL
16
+ - url: Sponsor website URL
17
+
18
+ Optional Data Fields:
19
+ - image_base_path: Base path for bare filenames (default: /assets/img/base/)
20
+
21
+ Optional Inputs (from include):
22
+ - data: Sponsors data object (overrides all fallbacks)
23
+
24
+ Data Source Hierarchy (in priority order):
25
+ 1. include.data - Explicitly passed sponsors data object
26
+ 2. page.with_sponsors_data - Page front matter configuration
27
+ 3. site.data.sponsors - Site-specific sponsors configuration
28
+ 4. site.data.base.sponsors - Theme default sponsors data
29
+
30
+ Conditional Logic:
31
+ - Component renders only when page.with_sponsors is true
32
+ - Members filtered by is_active != false
33
+ ================================================================================
34
+ {% endcomment %}
35
+
36
+ {%- assign with_sponsors = include.with_sponsors
37
+ | default: page.with_sponsors
38
+ %}
39
+
40
+ {%- assign with_sponsors_data = include.data
41
+ | default: page.with_sponsors_data
42
+ | default: site.data.sponsors
43
+ | default: site.data.base.sponsors
44
+ %}
45
+
46
+ {%- if with_sponsors -%}
47
+
48
+ {%- assign with_sponsors_schema = site.data.base.sponsors_schema.properties.with_sponsors_data.properties %}
49
+
50
+ {%- assign sponsors_members = with_sponsors_data.members | default: with_sponsors_schema.members.default -%}
51
+ {%- assign sponsors_image_base = with_sponsors_data.image_base_path | default: with_sponsors_schema.image_base_path.default -%}
52
+
53
+ <div class="d-flex flex-wrap justify-content-between py-4 my-4 border-top border-bottom border-top-1 border-bottom-1">
54
+ {%- comment %} === Presentation (Begin) === {% endcomment %}
55
+ {%- for member in sponsors_members -%}
56
+ {%- if member.is_active != false %}
57
+ <div class="card border-light m-4" style="max-height: 60px; max-width: 242px">
58
+ {%- if member.image contains "://" -%}
59
+ <a href="{{ member.url }}"><img src="{{ member.image }}" class="card-img-top rounded" style="max-height: 60px; max-width: 242px" alt="{{ member.name }}"></a>
60
+ {%- else -%}
61
+ <a href="{{ member.url }}"><img src="{{ site.baseurl }}{{ sponsors_image_base }}{{ member.image }}" class="card-img-top rounded" style="max-height: 60px; max-width: 242px" alt="{{ member.name }}"></a>
62
+ {%- endif -%}
63
+ </div>
64
+ {%- endif -%}
65
+ {%- endfor %}
66
+ {%- comment %} === Presentation (End) === {% endcomment %}
67
+ </div>
68
+
69
+ {%- endif -%}