jekyll-theme-centos 2.52.0.beta.57 → 2.52.0.beta.59

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 (70) hide show
  1. checksums.yaml +4 -4
  2. data/_data/base/announcement_schema.yml +2 -3
  3. data/_data/base/breadcrumb_schema.yml +13 -0
  4. data/_data/base/breakingnews_schema.yml +8 -0
  5. data/_data/base/event_schema.yml +10 -2
  6. data/_data/base/fontawesome_schema.yml +13 -0
  7. data/_data/base/navbar_schema.yml +8 -0
  8. data/_data/base/ogp.yml +1 -0
  9. data/_data/base/ogp_schema.yml +14 -0
  10. data/_includes/base/announcement.html.liquid +2 -2
  11. data/_includes/base/artwork.html.liquid +9 -9
  12. data/_includes/base/breadcrumb.html.liquid +15 -4
  13. data/_includes/base/breakingnews.html.liquid +6 -4
  14. data/_includes/base/event.html.liquid +4 -2
  15. data/_includes/base/fontawesome.html.liquid +23 -4
  16. data/_includes/base/footer.html.liquid +2 -2
  17. data/_includes/base/head.html.liquid +5 -3
  18. data/_includes/base/link.html.liquid +3 -7
  19. data/_includes/base/navbar.html.liquid +3 -3
  20. data/_includes/base/ogp.html.liquid +12 -2
  21. data/_includes/base/sponsors-cards.html.liquid +3 -3
  22. data/_includes/base/sponsors-carousel.html.liquid +3 -3
  23. data/_includes/base/title.html.liquid +2 -2
  24. data/_includes/base/toc.html.liquid +21 -19
  25. data/assets/img/base/page-with-alert.svg +164 -140
  26. data/assets/img/base/page-with-announcement.svg +792 -331
  27. data/assets/img/base/page-with-breakingnews.svg +861 -767
  28. data/assets/img/base/page-with-navbar.svg +827 -268
  29. data/assets/img/base/page-with-project.svg +367 -726
  30. data/assets/js/base/copyvalue.js +61 -177
  31. metadata +1 -40
  32. data/assets/img/base/example-ogp-image.png +0 -0
  33. data/assets/img/base/example-sponsors-design.png +0 -0
  34. data/assets/img/base/example-sponsors-logo-1.png +0 -0
  35. data/assets/img/base/example-sponsors-logo-2.png +0 -0
  36. data/assets/img/base/example-sponsors-logo-3.png +0 -0
  37. data/assets/img/base/example-sponsors-logo-4.png +0 -0
  38. data/assets/img/base/example-sponsors-logo-5.png +0 -0
  39. data/assets/img/base/example-sponsors-logo-6.png +0 -0
  40. data/assets/img/base/example-sponsors-logo-7.png +0 -0
  41. data/assets/img/base/example-sponsors-logo-8.png +0 -0
  42. data/assets/img/base/page-layout-default.png +0 -0
  43. data/assets/img/base/page-with-alert.png +0 -0
  44. data/assets/img/base/page-with-announcement.png +0 -0
  45. data/assets/img/base/page-with-artwork.png +0 -0
  46. data/assets/img/base/page-with-backtotop.png +0 -0
  47. data/assets/img/base/page-with-bits.png +0 -0
  48. data/assets/img/base/page-with-breadcrumb.png +0 -0
  49. data/assets/img/base/page-with-breakingnews.png +0 -0
  50. data/assets/img/base/page-with-color.png +0 -0
  51. data/assets/img/base/page-with-copyright.png +0 -0
  52. data/assets/img/base/page-with-copyvalue.png +0 -0
  53. data/assets/img/base/page-with-datatable.png +0 -0
  54. data/assets/img/base/page-with-event.png +0 -0
  55. data/assets/img/base/page-with-fontawesome.png +0 -0
  56. data/assets/img/base/page-with-footer.png +0 -0
  57. data/assets/img/base/page-with-heading.png +0 -0
  58. data/assets/img/base/page-with-highlight.png +0 -0
  59. data/assets/img/base/page-with-link.png +0 -0
  60. data/assets/img/base/page-with-locales.png +0 -0
  61. data/assets/img/base/page-with-navbar.png +0 -0
  62. data/assets/img/base/page-with-navindex.png +0 -0
  63. data/assets/img/base/page-with-ogp.png +0 -0
  64. data/assets/img/base/page-with-project.png +0 -0
  65. data/assets/img/base/page-with-shortcut.png +0 -0
  66. data/assets/img/base/page-with-social.png +0 -0
  67. data/assets/img/base/page-with-sponsors.png +0 -0
  68. data/assets/img/base/page-with-title.png +0 -0
  69. data/assets/img/base/page-with-toc.png +0 -0
  70. data/assets/img/base/screenshot-1200x600.png +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 29e3de8f157f7b87508708bbdb18de63f8bd44871d0feca1c8f867a299e9aa46
4
- data.tar.gz: 2012b819f38f4ebcf5e3bd300be8a3faea9f0b46916b2a94f289b1ace45b7583
3
+ metadata.gz: 7c273c21392a74e2982e965a0039930859404ac3d0a498bb2be52927f2293b01
4
+ data.tar.gz: 01eaa12144714ace83cee8da787976e41dc483b93c3b90e0516d5891a282fb69
5
5
  SHA512:
6
- metadata.gz: 0e3fed1004fc6820dac94c797fd5a4cebd99d967a088797e2f59fd328be508c382fee93d30c5dd66a6f17d953204b8ed344d68c300f25289e67c3bb1a90dd1ae
7
- data.tar.gz: 741b4f8ad83b80b1ebc127834e4a19d2051191a21c8af6b074b7f8cf5e7cca028feda26631818bcb923e085835e9908d6f161fac7b3aaad5e82d1a0f9d368faf
6
+ metadata.gz: 86e59a3bdafb790a2701994f52cc8893aa677a6231d2aeeb25e4afc77b893d4028913a8ef7d98cc6d5e9dbe82d63f55587d04ed7954bffbce1f02ac923a9b8d4
7
+ data.tar.gz: 204a009e13b631c3aafc2a4dc71f48fb62cb0b7ab708db323cdedb5584876844d59133f3bd797c41c1959cbd3ff3d35b2d4949f77d4cc1c5678586ee9c94bb50
@@ -37,12 +37,11 @@ properties:
37
37
  `centos-purple-800`.
38
38
  icon:
39
39
  type: string
40
- default: ""
40
+ default: "fa-solid fa-bullhorn"
41
41
  description: >-
42
42
  The Font Awesome icon class (e.g., `fa-solid fa-bell`) to display
43
43
  on the left side of the announcement. Only [freely distributed Font
44
- Awesome icons](https://fontawesome.com/search?ic=free-collection) are supported. If no value is provided, the default
45
- icon `fa-solid fa-bullhorn` will be used by the rendering engine.
44
+ Awesome icons](https://fontawesome.com/search?ic=free-collection) are supported.
46
45
  required:
47
46
  - content
48
47
  additionalProperties: false
@@ -11,4 +11,17 @@ properties:
11
11
  description: >-
12
12
  Enables or disables the rendering of the breadcrumb navigation component.
13
13
  Set to `true` (default) to display the breadcrumbs; set to `false` to hide them.
14
+ with_breadcrumb_data:
15
+ type: object
16
+ default: {}
17
+ description: >-
18
+ Configuration object for the breadcrumb navigation component.
19
+ properties:
20
+ arialabel:
21
+ type: string
22
+ default: "breadcrumb"
23
+ description: >-
24
+ The `aria-label` attribute value for the breadcrumb `<nav>` element.
25
+ Screen readers use this label to identify the navigation landmark.
26
+ additionalProperties: false
14
27
  additionalProperties: false
@@ -11,6 +11,14 @@ properties:
11
11
  Enables or disables the Breaking News component. Set to `true` to
12
12
  display the messages; set to `false` (default) to hide them. When enabled,
13
13
  the `with_breakingnews_data` property must be provided.
14
+ breakingnews_alert_height:
15
+ type: integer
16
+ default: 31
17
+ description: >-
18
+ Height in pixels of a single breaking news alert bar. Used by both the
19
+ breakingnews component and the head component to calculate sticky
20
+ positioning and scroll-margin-top offsets. Must match the rendered height
21
+ of `.breakingnews.alert.p-2`.
14
22
  with_breakingnews_data:
15
23
  type: array
16
24
  default: [] # Corrected: Moved default to array level and set to []
@@ -24,10 +24,18 @@ properties:
24
24
  title:
25
25
  type: string
26
26
  description: The name or title of the event. This field is required.
27
- summary:
27
+ description:
28
28
  type: string
29
29
  default: ""
30
- description: A brief summary or short description of the event.
30
+ description: A brief description of the event.
31
+ address:
32
+ type: string
33
+ default: ""
34
+ description: The street address of the event venue.
35
+ city:
36
+ type: string
37
+ default: ""
38
+ description: The city where the event takes place.
31
39
  date:
32
40
  type: string # Changed from 'date' to 'string' for flexibility
33
41
  default: ""
@@ -40,6 +40,19 @@ properties:
40
40
  type: string
41
41
  default: "sha512-6BTOlkauINO65nLhXhthZMtepgJSghyimIalb+crKRPhvhmsCdnIuGcVbR5/aQY2A+260iC1OPy1oCdB6pSSwQ=="
42
42
  description: The Subresource Integrity (SRI) JavaScript checksum (`sha512-...`) for the specified bundle, ensuring the security and integrity of the script file.
43
+ mode:
44
+ type: string
45
+ enum:
46
+ - "svg+js"
47
+ - "css"
48
+ default: "css"
49
+ description: >-
50
+ Loading mode for Font Awesome. `svg+js` (default) downloads a JavaScript
51
+ bundle that replaces `<i class="fa-...">` elements with inline SVGs via DOM
52
+ mutation — enables power transforms, layering, and pseudo-element watching.
53
+ `css` downloads a stylesheet and loads WOFF2 font files on demand — lighter
54
+ first-visit payload and no DOM manipulation cost. Use `css` when SVG+JS-exclusive
55
+ features are not needed.
43
56
  required:
44
57
  - version
45
58
  - cdn
@@ -11,6 +11,14 @@ properties:
11
11
  Controls the visibility of the Navigation Bar component. Set to `true`
12
12
  (default) to display the navbar at the top of the page. Set to `false`
13
13
  to hide it entirely.
14
+ navbar_height:
15
+ type: integer
16
+ default: 42
17
+ description: >-
18
+ Height in pixels of the fixed-top navbar bar. Used by the breakingnews
19
+ component and the head component to calculate sticky positioning and
20
+ scroll-margin-top offsets. Must match the rendered height of
21
+ `nav.navbar.fixed-top`.
14
22
  with_navbar_data:
15
23
  type: object
16
24
  default: {}
data/_data/base/ogp.yml CHANGED
@@ -5,6 +5,7 @@ og:
5
5
  title: true
6
6
  url: true
7
7
  description: true
8
+ logo: /assets/icons/apple-touch-icon.png
8
9
  image:
9
10
  url: true
10
11
  alt: The CentOS Project
@@ -85,6 +85,20 @@ properties:
85
85
  default: audio/ogg
86
86
  description: The MIME type of the audio file via the `og:audio:type` tag.
87
87
  additionalProperties: false
88
+ site_name:
89
+ type: string
90
+ description: >-
91
+ The name of the overall website for the `og:site_name` tag (e.g.,
92
+ `"CentOS"`). Distinct from the page title. Defaults to `site.title`
93
+ from the Jekyll configuration when not set explicitly.
94
+ logo:
95
+ type: string
96
+ default: "/assets/icons/apple-touch-icon.png"
97
+ description: >-
98
+ Path to the organization logo image for the `og:logo` meta tag.
99
+ Used by Google Knowledge Graph and some OGP validators to identify
100
+ the site's primary logo. Not part of the official OGP specification;
101
+ treated as a path relative to `site.url + site.baseurl`.
88
102
  video:
89
103
  type: object
90
104
  description: Configuration for video media files to accompany the content (`og:video`).
@@ -37,10 +37,10 @@ Data Source Hierarchy (priority):
37
37
  | default: site.data.base.announcement
38
38
  %}
39
39
 
40
- {%- assign with_announcement_schema = site.data.base.announcement_schema.properties.with_announcement_data.items.properties %}
41
-
42
40
  {%- if with_announcement %}
43
41
 
42
+ {%- assign with_announcement_schema = site.data.base.announcement_schema.properties.with_announcement_data.items.properties %}
43
+
44
44
  {%- comment %} === Presentation === {% endcomment %}
45
45
  {%- for announcement in with_announcement_data %}
46
46
 
@@ -39,25 +39,25 @@ Data Source Hierarchy (priority):
39
39
  | default: site.data.base.artwork
40
40
  %}
41
41
 
42
- {%- assign with_artwork_schema = site.data.base.artwork_schema.properties.with_artwork_data.properties %}
43
-
44
42
  {%- if with_artwork %}
45
43
 
44
+ {%- assign with_artwork_schema = site.data.base.artwork_schema.properties.with_artwork_data.properties %}
45
+
46
46
  {%- comment %} === Presentation === {% endcomment %}
47
47
 
48
48
  {%- comment %} --- Defaults --- {% endcomment %}
49
- {%- assign artwork_image = with_artwork_data.image | default: with_artwrk_schema.image.default %}
50
- {%- assign artwork_alt = with_artwork_data.alt | default: with_artwrk_schema.alt.default %}
51
- {%- assign artwork_class = with_artwork_data.class | default: with_artwrk_schema.class.default %}
52
- {%- assign artwork_image_class = with_artwork_data.image_class | default: with_artwrk_schema.image_class.default %}
49
+ {%- assign artwork_image = with_artwork_data.image | default: with_artwork_schema.image.default %}
50
+ {%- assign artwork_alt = with_artwork_data.alt | default: with_artwork_schema.alt.default %}
51
+ {%- assign artwork_class = with_artwork_data.class | default: with_artwork_schema.class.default %}
52
+ {%- assign artwork_image_class = with_artwork_data.image_class | default: with_artwork_schema.image_class.default %}
53
53
 
54
54
  {%- comment %} --- HTML --- {% endcomment %}
55
55
  <div class="{{ artwork_class }}">
56
- {% if artwork_image contains "https://" or artwork_image contains "http://" %}
56
+ {%- if artwork_image contains "://" %}
57
57
  <img src="{{ artwork_image }}" class="{{ artwork_image_class }}" alt="{{ artwork_alt }}" />
58
- {% else %}
58
+ {%- else %}
59
59
  <img src="{{ site.baseurl }}{{ artwork_image }}" class="{{ artwork_image_class }}" alt="{{ artwork_alt }}" />
60
- {% endif %}
60
+ {%- endif %}
61
61
  </div>
62
62
 
63
63
  {%- endif -%}
@@ -18,9 +18,12 @@ Required Inputs:
18
18
  - page.original_url: URL without locale prefix (used for breadcrumb structure)
19
19
  - page.title: Display text for active breadcrumb
20
20
 
21
- Data Sources:
22
- - site.baseurl: Base URL prefix
23
- - site.with_link_decorator_data.default_link_classes: CSS classes
21
+ Optional Inputs:
22
+ - with_breadcrumb_data.arialabel: aria-label for the <nav> element (default: "breadcrumb")
23
+
24
+ Data Source Hierarchy:
25
+ - with_breadcrumb: include.with_breadcrumb → page.with_breadcrumb
26
+ - with_breadcrumb_data: include.data → page.with_breadcrumb_data → site.data.breadcrumb → site.data.base.breadcrumb
24
27
  ================================================================================
25
28
  {% endcomment %}
26
29
 
@@ -28,15 +31,23 @@ Data Sources:
28
31
  | default: page.with_breadcrumb
29
32
  %}
30
33
 
34
+ {%- assign with_breadcrumb_data = include.data
35
+ | default: page.with_breadcrumb_data
36
+ | default: site.data.breadcrumb
37
+ | default: site.data.base.breadcrumb
38
+ %}
39
+
31
40
  {%- if with_breadcrumb %}
32
41
 
42
+ {%- assign with_breadcrumb_schema = site.data.base.breadcrumb_schema.properties.with_breadcrumb_data.properties %}
43
+
33
44
  {%- comment %} Use original_url if available (without locale), otherwise use full url {%- endcomment %}
34
45
  {%- assign breadcrumb_url = page.original_url | default: page.url %}
35
46
 
36
47
  {%- comment %} Use plugin-provided locale (set for localized pages, defaults to 'en') {%- endcomment %}
37
48
  {%- assign detected_locale = page.locale | default: 'en' %}
38
49
 
39
- <nav aria-label="{{ include.arialabel | default: 'breadcrumb' }}">
50
+ <nav aria-label="{{ with_breadcrumb_data.arialabel | default: with_breadcrumb_schema.arialabel.default | default: 'breadcrumb' }}">
40
51
  <ol class="breadcrumb mb-0">
41
52
  {%- comment %} Home link - adjust for locale {%- endcomment %}
42
53
  {%- if detected_locale == 'en' or detected_locale == '' %}
@@ -39,14 +39,15 @@ Data Source Hierarchy (priority):
39
39
  | default: site.data.base.breakingnews
40
40
  %}
41
41
 
42
- {%- assign with_breakingnews_schema = site.data.base.breakingnews_schema.properties.with_breakingnews_data.items.properties %}
43
-
44
42
  {%- if with_breakingnews %}
45
43
 
44
+ {%- assign with_breakingnews_schema = site.data.base.breakingnews_schema.properties.with_breakingnews_data.items.properties %}
45
+
46
46
  {%- comment %} === Presentation === {% endcomment %}
47
- {% assign breakingnews_alert_height = 38 %}
48
- {% assign navbar_height = 42 %}
47
+ {%- assign breakingnews_alert_height = site.data.base.breakingnews_schema.properties.breakingnews_alert_height.default %}
48
+ {%- assign navbar_height = site.data.base.navbar_schema.properties.navbar_height.default %}
49
49
 
50
+ {%- if with_breakingnews_data.size > 0 %}
50
51
  <div class="sticky-top sticky-top-breakingnews">
51
52
  {% for item in with_breakingnews_data %}
52
53
 
@@ -84,5 +85,6 @@ Data Source Hierarchy (priority):
84
85
  </div>
85
86
  {% endfor %}
86
87
  </div>
88
+ {%- endif %}
87
89
 
88
90
  {%- endif -%}
@@ -44,11 +44,12 @@ Data Source Hierarchy (priority):
44
44
  | default: site.data.base.event
45
45
  %}
46
46
 
47
- {%- assign with_event_schema = site.data.base.event_schema.properties.with_event_data.properties %}
48
-
49
47
  {%- if with_event %}
50
48
 
49
+ {%- assign with_event_schema = site.data.base.event_schema.properties.with_event_data.items.properties %}
50
+
51
51
  {%- comment %} === Presentation === {% endcomment %}
52
+ {%- if with_event_data.size > 0 %}
52
53
  <div class="mb-3">
53
54
  {%- for event in with_event_data %}
54
55
  {%- comment %} --- Defaults --- {% endcomment %}
@@ -99,5 +100,6 @@ Data Source Hierarchy (priority):
99
100
  </div>
100
101
  {% endfor %}
101
102
  </div>
103
+ {%- endif %}
102
104
 
103
105
  {%- endif -%}
@@ -7,14 +7,18 @@ with integrity checks.
7
7
 
8
8
  Design Logic:
9
9
  - CDN-based library loading with SRI integrity verification
10
- - Format switching: separate head (CSS) and script (JS) includes
11
- - CSS bundle: complete icon stylesheet (solid, regular, brands)
10
+ - Two loading modes: svg+js (default) and css
11
+ - svg+js: JavaScript bundle replaces <i> tags with inline SVGs via DOM mutation;
12
+ enables power transforms, layering, pseudo-element watching
13
+ - css: stylesheet + WOFF2 font files loaded on demand; lighter payload, no DOM cost
14
+ - Format switching: separate head (CSS link) and script (JS) includes; preload hints mode-aware
12
15
  - Subresource Integrity (SRI): ensures file hasn't been tampered with
13
16
  - Privacy-focused: referrerpolicy="no-referrer"
14
17
 
15
18
  Optional Inputs:
16
- - type: "head" for CSS, "script" for JavaScript
17
- - version: Font Awesome version (e.g., "6.4.0")
19
+ - type: "preload" for resource hint, "head" for CSS link, "script" for JavaScript
20
+ - mode: "svg+js" (default) or "css" — controls which assets are emitted per type
21
+ - version: Font Awesome version (e.g., "7.0.1")
18
22
  - cdn: CDN base URL (default: cdnjs.cloudflare.com)
19
23
  - css_bundle_name, js_bundle_name: Bundle identifiers
20
24
  - css_bundle_integrity, js_bundle_integrity: SRI hashes
@@ -51,18 +55,33 @@ Data Source Hierarchy (priority):
51
55
  {%- assign fontawesome_css_bundle_integrity = with_fontawesome_data.css_bundle_integrity | default: with_fontawesome_schema.css_bundle_integrity.default %}
52
56
  {%- assign fontawesome_js_bundle_name = with_fontawesome_data.js_bundle_name | default: with_fontawesome_schema.js_bundle_name.default %}
53
57
  {%- assign fontawesome_js_bundle_integrity = with_fontawesome_data.js_bundle_integrity | default: with_fontawesome_schema.js_bundle_integrity.default %}
58
+ {%- assign fontawesome_mode = with_fontawesome_data.mode | default: with_fontawesome_schema.mode.default | default: "svg+js" %}
59
+
60
+ {%- capture html_fontawesome_preload %}
61
+ {%- if fontawesome_mode == "css" %}
62
+ <link rel="preload" href="{{ fontawesome_cdn }}/{{ fontawesome_version }}/css/{{ fontawesome_css_bundle_name }}.min.css" as="style" fetchpriority="high" crossorigin="anonymous" />
63
+ {%- else %}
64
+ <link rel="preload" href="{{ fontawesome_cdn }}/{{ fontawesome_version }}/js/{{ fontawesome_js_bundle_name }}.min.js" as="script" fetchpriority="high" crossorigin="anonymous" />
65
+ {%- endif %}
66
+ {%- endcapture %}
54
67
 
55
68
  {%- capture html_fontawesome_head %}
69
+ {%- if fontawesome_mode == "css" %}
56
70
  <link rel="stylesheet" href="{{ fontawesome_cdn }}/{{ fontawesome_version }}/css/{{ fontawesome_css_bundle_name }}.min.css" integrity="{{ fontawesome_css_bundle_integrity }}" crossorigin="anonymous" referrerpolicy="no-referrer" />
71
+ {%- endif %}
57
72
  {%- endcapture %}
58
73
 
59
74
  {%- capture html_fontawesome_script %}
75
+ {%- if fontawesome_mode == "svg+js" %}
60
76
  <script src="{{ fontawesome_cdn }}/{{ fontawesome_version }}/js/{{ fontawesome_js_bundle_name }}.min.js" integrity="{{ fontawesome_js_bundle_integrity }}" crossorigin="anonymous" referrerpolicy="no-referrer" defer></script>
77
+ {%- endif %}
61
78
  {%- endcapture %}
62
79
 
63
80
  {%- comment %} --- HTML --- {% endcomment %}
64
81
  {%- assign type = include.type %}
65
82
  {%- case type %}
83
+ {%- when "preload" %}
84
+ {{ html_fontawesome_preload }}
66
85
  {%- when "head" %}
67
86
  {{ html_fontawesome_head }}
68
87
  {%- when "script" %}
@@ -8,6 +8,8 @@
8
8
  | default: site.data.base.footer
9
9
  %}
10
10
 
11
+ {%- if with_footer -%}
12
+
11
13
  {%- assign with_footer_schema = site.data.base.footer_schema.properties.with_footer_data.properties %}
12
14
 
13
15
  {%- assign footer_brand_image = with_footer_data.brand_image | default: with_footer_schema.brand_image.default %}
@@ -16,8 +18,6 @@
16
18
  {%- assign footer_brand_manifestation = with_footer_data.brand_manifestation | default: with_footer_schema.brand_manifestation.default %}
17
19
  {%- assign footer_brand_manifestation_class = with_footer_data.brand_manifestation_class | default: with_footer_schema.brand_manifestation_class.default %}
18
20
 
19
- {%- if with_footer -%}
20
-
21
21
  <div class="container">
22
22
  <div class="row justify-content-between align-items-start gx-5">
23
23
  <div class="col-sm-12 col-lg-4">
@@ -14,7 +14,7 @@ Design Logic:
14
14
  - Conditional includes: OGP, Highlight.js, DataTables, FontAwesome (SVG+JS)
15
15
  - CSS prioritization: custom stylesheet last for override
16
16
  - Script loading: Bootstrap base first (defer), then optional extensions, then UI behaviors
17
- - Bootstrap preloaded (high-priority fetch); CDN origins preconnected + dns-prefetched per active component
17
+ - Bootstrap and FontAwesome preloaded (high-priority fetch); CDN origins preconnected + dns-prefetched per active component
18
18
 
19
19
  Required Inputs:
20
20
  - page.title: Current page title
@@ -68,6 +68,7 @@ Optional Inputs:
68
68
  <link rel="dns-prefetch" href="https://cdn.datatables.net" />
69
69
  {%- endif %}
70
70
  <link rel="preload" href="{{ site.baseurl }}/assets/js/bootstrap.bundle.min.js" as="script" fetchpriority="high" />
71
+ {%- include base/fontawesome.html.liquid type="preload" %}
71
72
  <link rel="preload" href="https://fonts.googleapis.com/css2?family=Montserrat:wght@300;400;500;600;700&family=Source+Code+Pro:ital,wght@0,400;0,700&display=swap" as="style" onload="this.onload=null;this.rel='stylesheet'" />
72
73
  <noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Montserrat:wght@300;400;500;600;700&family=Source+Code+Pro:ital,wght@0,400;0,700&display=swap" /></noscript>
73
74
  <link rel="stylesheet" href="{{ site.baseurl }}/assets/css/base/stylesheet.min.css" />
@@ -78,8 +79,8 @@ Uses CSS custom properties for cleaner, more maintainable dynamic styling.
78
79
  {%- endcomment %}
79
80
  {%- assign breakingnews = page.with_breakingnews_data | default: site.data.breakingnews | default: site.data.base.breakingnews %}
80
81
  {%- if page.with_breakingnews == true and breakingnews.size > 0 %}
81
- {%- assign breakingnews_alert_height = 31 %}
82
- {%- assign navbar_height = 42 %}
82
+ {%- assign breakingnews_alert_height = site.data.base.breakingnews_schema.properties.breakingnews_alert_height.default %}
83
+ {%- assign navbar_height = site.data.base.navbar_schema.properties.navbar_height.default %}
83
84
  {%- assign breakingnews_offset = 0 %}
84
85
  {%- for item in breakingnews %}
85
86
  {%- if forloop.first %}
@@ -114,6 +115,7 @@ Uses CSS custom properties for cleaner, more maintainable dynamic styling.
114
115
  {%- endif %}
115
116
 
116
117
  {%- comment %} CSS dependencies {%- endcomment %}
118
+ {%- include base/fontawesome.html.liquid type="head" %}
117
119
  {%- include base/highlight.html.liquid type="head" %}
118
120
  {%- include base/datatable.html.liquid type="head" %}
119
121
 
@@ -40,6 +40,7 @@ Security & External Links:
40
40
  ================================================================================
41
41
  {% endcomment %}
42
42
 
43
+ {%- if page.with_link -%}
43
44
  {%- capture html_link -%}
44
45
  {%- comment %} === Data source selection === {% endcomment %}
45
46
  {%- assign link = include.link | default: nil %}
@@ -80,10 +81,7 @@ Security & External Links:
80
81
  {%- if class != nil -%}
81
82
  {%- assign link_class = class %}
82
83
  {%- else -%}
83
- {%- assign link_class = "link link-" | append: color %}
84
- {%- assign link_class = link_class | append: " link-offset-3 link-offset-3-hover link-underline-" %}
85
- {%- assign link_class = link_class | append: color %}
86
- {%- assign link_class = link_class | append: " link-underline-opacity-0 link-underline-opacity-100-hover" %}
84
+ {%- capture link_class -%}link link-{{ color }} link-offset-3 link-offset-3-hover link-underline-{{ color }} link-underline-opacity-0 link-underline-opacity-100-hover{%- endcapture -%}
87
85
  {%- endif -%}
88
86
 
89
87
  {%- comment %} --- Security attributes for external links --- {% endcomment %}
@@ -127,7 +125,5 @@ Security & External Links:
127
125
  {{- link_name | strip_newlines | strip -}}
128
126
  </a>
129
127
  {%- endcapture -%}
130
-
131
- {%- if page.with_link -%}
132
- {{- html_link }}
128
+ {{- html_link }}
133
129
  {%- endif -%}
@@ -40,10 +40,10 @@ Data Source Hierarchy (priority):
40
40
  | default: site.data.base.navbar
41
41
  %}
42
42
 
43
- {%- assign with_navbar_schema = site.data.base.navbar_schema.properties.with_navbar_data.properties %}
44
-
45
43
  {%- if with_navbar %}
46
44
 
45
+ {%- assign with_navbar_schema = site.data.base.navbar_schema.properties.with_navbar_data.properties %}
46
+
47
47
  {%- assign navbar_class = with_navbar_data.class | default: with_navbar_schema.class.default %}
48
48
  {%- assign navbar_brand_image = with_navbar_data.brand_image | default: with_navbar_schema.brand_image.default %}
49
49
  {%- assign navbar_brand_image_class = with_navbar_data.brand_image_class | default: with_navbar_schema.brand_image_class.default %}
@@ -94,7 +94,7 @@ Data Source Hierarchy (priority):
94
94
  {%- else %}
95
95
  <li class="nav-item dropdown">
96
96
  <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown-{{ forloop.index }}" role="button" data-bs-toggle="dropdown" aria-expanded="false">
97
- <i class="{{ navitem.icon }} me-1"></i>{{ navitem.name }}
97
+ <i class="{{ navitem.icon }} me-1" aria-hidden="true"></i>{{ navitem.name }}
98
98
  </a>
99
99
  <ul class="dropdown-menu dropdown-menu-dark shadow">
100
100
  {%- for dropdownitem in navitem.menu %}
@@ -25,6 +25,8 @@ Optional Inputs:
25
25
 
26
26
  Data Source Hierarchy:
27
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'
28
30
  - og:locale: page.locale (jekyll-l10n) → with_ogp_data.locale → schema default → 'en_US'
29
31
  - og:image:type: with_ogp_data.og.image.type → schema default → 'image/png'
30
32
  - og:image:width: with_ogp_data.og.image.width → schema default → 1200
@@ -91,9 +93,13 @@ Data Source Hierarchy:
91
93
  <meta {{ meta_attr }}="{{ property }}:title" content="{{ page.title }}" />
92
94
  {%- endif %}
93
95
 
94
- {%- comment %} --- OG type (after title, before url) --- {% endcomment %}
96
+ {%- comment %} --- OG type and logo (after title, before url) --- {% endcomment %}
95
97
  {%- if property == "og" %}
96
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 %}
97
103
  {%- endif %}
98
104
 
99
105
  {%- comment %} --- URL --- {% endcomment %}
@@ -124,8 +130,12 @@ Data Source Hierarchy:
124
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' }}" />
125
131
  {%- endif %}
126
132
 
127
- {%- comment %} --- OG locale (after image) --- {% endcomment %}
133
+ {%- comment %} --- OG site_name and locale (after image) --- {% endcomment %}
128
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 %}
129
139
  <meta property="og:locale" content="{{ ogp_locale }}" />
130
140
  {%- endif %}
131
141
 
@@ -43,19 +43,19 @@ Conditional Logic:
43
43
  | default: site.data.base.sponsors
44
44
  %}
45
45
 
46
+ {%- if with_sponsors -%}
47
+
46
48
  {%- assign with_sponsors_schema = site.data.base.sponsors_schema.properties.with_sponsors_data.properties %}
47
49
 
48
50
  {%- assign sponsors_members = with_sponsors_data.members | default: with_sponsors_schema.members.default -%}
49
51
  {%- assign sponsors_image_base = with_sponsors_data.image_base_path | default: with_sponsors_schema.image_base_path.default -%}
50
52
 
51
- {%- if with_sponsors -%}
52
-
53
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
54
  {%- comment %} === Presentation (Begin) === {% endcomment %}
55
55
  {%- for member in sponsors_members -%}
56
56
  {%- if member.is_active != false %}
57
57
  <div class="card border-light m-4" style="max-height: 60px; max-width: 242px">
58
- {%- if member.image contains "https://" or member.image contains "http://" -%}
58
+ {%- if member.image contains "://" -%}
59
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
60
  {%- else -%}
61
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>
@@ -47,6 +47,8 @@ Conditional Logic:
47
47
  | default: site.data.base.sponsors
48
48
  %}
49
49
 
50
+ {%- if with_sponsors -%}
51
+
50
52
  {%- assign with_sponsors_schema = site.data.base.sponsors_schema.properties.with_sponsors_data.properties %}
51
53
 
52
54
  {%- assign sponsors_title = with_sponsors_data.title | default: with_sponsors_schema.title.default -%}
@@ -57,8 +59,6 @@ Conditional Logic:
57
59
 
58
60
  {%- assign carousel_id = include.id | default: "sponsorsCarousel" -%}
59
61
 
60
- {%- if with_sponsors -%}
61
-
62
62
  <div id="{{ carousel_id }}" class="d-flex flex-wrap mb-5">
63
63
 
64
64
  {%- comment %} === Presentation (Begin) === {% endcomment %}
@@ -73,7 +73,7 @@ Conditional Logic:
73
73
  {%- if member.is_active != false %}
74
74
  <div class="carousel-item{% if forloop.first %} active{% endif %}">
75
75
  <div class="w-100 align-middle" style="height: 80px; width: 262px">
76
- {%- if member.image contains "https://" or member.image contains "http://" -%}
76
+ {%- if member.image contains "://" -%}
77
77
  <a href="{{ member.url }}"><img src="{{ member.image }}" class="rounded" style="max-height: 60px; max-width: 242px" alt="{{ member.name }}"></a>
78
78
  {%- else -%}
79
79
  <a href="{{ member.url }}"><img src="{{ site.baseurl }}{{ sponsors_image_base }}{{ member.image }}" class="rounded" style="max-height: 60px; max-width: 242px" alt="{{ member.name }}"></a>
@@ -44,6 +44,8 @@ Conditional Logic:
44
44
  | default: site.data.base.title
45
45
  %}
46
46
 
47
+ {%- if with_title -%}
48
+
47
49
  {%- assign with_title_schema = site.data.base.title_schema.properties.with_title_data.properties %}
48
50
 
49
51
  {%- comment %} === Presentation === {% endcomment %}
@@ -53,8 +55,6 @@ Conditional Logic:
53
55
  {%- assign title_lead = with_title_data.title_lead | default: page.title_lead %}
54
56
  {%- assign title_lead_class = with_title_data.title_lead_class | default: with_title_schema.title_lead_class.default %}
55
57
 
56
- {%- if page.with_title -%}
57
-
58
58
  <div class="{{ class }}">
59
59
  <p class="{{ title_class }}">{{ title }}</p>
60
60
  {% if title_lead != "" %}
@@ -33,30 +33,32 @@ Optional Inputs (from include):
33
33
  - data: TOC configuration object
34
34
 
35
35
  Data Source Hierarchy (in priority order):
36
- 1. include.data - Explicitly passed configuration
37
- 2. page.with_toc_data - Page front matter
38
- 3. site.data.toc - Site configuration
39
- 4. site.data.base.toc - Theme defaults
36
+ - with_toc: include.with_toc page.with_toc
37
+ - with_toc_data: include.data page.with_toc_data site.data.toc site.data.base.toc
40
38
  ================================================================================
41
39
  {% endcomment %}
42
40
 
43
- {%- if page.with_toc -%}
44
- {%- assign toc = include.data | default: page.with_toc_data | default: site.data.toc | default: site.data.base.toc %}
45
- {%- assign toc_schema = site.data.base.toc_schema.properties["with_toc_data"].properties %}
41
+ {%- assign with_toc = include.with_toc
42
+ | default: page.with_toc
43
+ %}
44
+
45
+ {%- if with_toc -%}
46
+ {%- assign with_toc_data = include.data | default: page.with_toc_data | default: site.data.toc | default: site.data.base.toc %}
47
+ {%- assign with_toc_schema = site.data.base.toc_schema.properties["with_toc_data"].properties %}
46
48
 
47
49
  {%- comment %} === Configuration properties === {% endcomment %}
48
- {%- assign class = toc.class | default: toc_schema["class"].default %}
49
- {%- assign id = toc.id | default: toc_schema["id"].default | default: "page-toc" %}
50
- {%- assign item_class = toc.item_class | default: toc_schema["item_class"].default | default: "my-2" %}
51
- {%- assign anchor_class = toc.anchor_class | default: toc_schema["anchor_class"].default | default: site.with_link_decorator_data.default_link_classes %}
52
- {%- assign h_min = toc.h_min | default: toc_schema["h_min"].default %}
53
- {%- assign h_max = toc.h_max | default: toc_schema["h_max"].default %}
54
- {%- assign ordered = toc.ordered | default: toc_schema["ordered"].default %}
55
- {%- assign submenu_class = toc.submenu_class | default: toc_schema["submenu_class"].default %}
56
- {%- assign base_url = toc.base_url | default: toc_schema["base_url"].default %}
57
- {%- assign sanitize = toc.sanitize | default: toc_schema["sanitize"].default %}
58
- {%- assign skip_no_ids = toc.skip_no_ids | default: toc_schema["skip_no_ids"].default %}
59
- {%- assign flat_toc = toc.flat_toc | default: toc_schema["flat_toc"].default %}
50
+ {%- assign class = with_toc_data.class | default: with_toc_schema["class"].default %}
51
+ {%- assign id = with_toc_data.id | default: with_toc_schema["id"].default | default: "page-toc" %}
52
+ {%- assign item_class = with_toc_data.item_class | default: with_toc_schema["item_class"].default | default: "my-2" %}
53
+ {%- assign anchor_class = with_toc_data.anchor_class | default: with_toc_schema["anchor_class"].default | default: site.with_link_decorator_data.default_link_classes %}
54
+ {%- assign h_min = with_toc_data.h_min | default: with_toc_schema["h_min"].default %}
55
+ {%- assign h_max = with_toc_data.h_max | default: with_toc_schema["h_max"].default %}
56
+ {%- assign ordered = with_toc_data.ordered | default: with_toc_schema["ordered"].default %}
57
+ {%- assign submenu_class = with_toc_data.submenu_class | default: with_toc_schema["submenu_class"].default %}
58
+ {%- assign base_url = with_toc_data.base_url | default: with_toc_schema["base_url"].default %}
59
+ {%- assign sanitize = with_toc_data.sanitize | default: with_toc_schema["sanitize"].default %}
60
+ {%- assign skip_no_ids = with_toc_data.skip_no_ids | default: with_toc_schema["skip_no_ids"].default %}
61
+ {%- assign flat_toc = with_toc_data.flat_toc | default: with_toc_schema["flat_toc"].default %}
60
62
 
61
63
  {%- comment %} === Presentation === {% endcomment %}
62
64