jekyll-theme-centos 2.52.0.beta.56 → 2.52.0.beta.58

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 (49) hide show
  1. checksums.yaml +4 -4
  2. data/_config.yml +1 -1
  3. data/_data/base/backtotop_schema.yml +6 -0
  4. data/_data/base/breadcrumb_schema.yml +13 -0
  5. data/_data/base/datatable_schema.yml +3 -3
  6. data/_data/base/head_schema.yml +19 -0
  7. data/_data/base/heading_anchor.yml +1 -3
  8. data/_data/base/heading_anchor_schema.yml +1 -1
  9. data/_data/base/highlight_schema.yml +30 -0
  10. data/_data/base/ogp.yml +24 -0
  11. data/_data/base/ogp_schema.yml +28 -22
  12. data/_includes/base/backtotop.html.liquid +10 -2
  13. data/_includes/base/breadcrumb.html.liquid +15 -4
  14. data/_includes/base/copyvalue.html.liquid +10 -1
  15. data/_includes/base/datatable.html.liquid +8 -3
  16. data/_includes/base/fontawesome.html.liquid +2 -2
  17. data/_includes/base/{partials/footer.html.liquid → footer.html.liquid} +2 -2
  18. data/_includes/base/{partials/head.html.liquid → head.html.liquid} +54 -14
  19. data/_includes/base/heading_anchor.html.liquid +8 -3
  20. data/_includes/base/highlight.html.liquid +14 -9
  21. data/_includes/base/{partials/navbar.html.liquid → navbar.html.liquid} +3 -3
  22. data/_includes/base/navindex.html.liquid +2 -2
  23. data/_includes/base/ogp.html.liquid +68 -56
  24. data/_includes/base/toc.html.liquid +21 -19
  25. data/_layouts/base/default.html +7 -10
  26. data/_sass/base/_customization.scss +27 -13
  27. data/assets/img/base/example-ogp-image.png +0 -0
  28. data/assets/img/base/example-ogp-image.svg +297 -0
  29. data/assets/img/base/page-layout-default.png +0 -0
  30. data/assets/img/base/page-layout-default.svg +4 -4
  31. data/assets/img/base/page-with-ogp.png +0 -0
  32. data/assets/img/base/page-with-ogp.svg +333 -300
  33. data/assets/img/centos-social-share.png +0 -0
  34. data/assets/js/base/backtotop.js +7 -10
  35. data/assets/js/base/copyvalue.js +96 -94
  36. data/assets/js/base/datatable.js +28 -42
  37. data/assets/js/base/heading-anchor.js +53 -53
  38. data/assets/js/base/highlight.js +9 -3
  39. data/assets/js/base/init-tooltips.js +10 -4
  40. metadata +15 -13
  41. data/_data/base/partials/head_schema.yml +0 -47
  42. data/_includes/base/partials/script.html.liquid +0 -47
  43. /data/_data/base/{partials/content.yml → content.yml} +0 -0
  44. /data/_data/base/{partials/content_schema.yml → content_schema.yml} +0 -0
  45. /data/_data/base/{partials/footer.yml → footer.yml} +0 -0
  46. /data/_data/base/{partials/footer_schema.yml → footer_schema.yml} +0 -0
  47. /data/_data/base/{partials/navbar.yml → navbar.yml} +0 -0
  48. /data/_data/base/{partials/navbar_schema.yml → navbar_schema.yml} +0 -0
  49. /data/_data/base/{partials/script_schema.yml → script_schema.yml} +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 03d8ff8dc07628a4cbbc99b17a7a423953e243a9534b892aa7f36b9f8e8ab694
4
- data.tar.gz: a5bdb40ae9427b116c33d8cc357037ad2275ba31ed2247e2125580a7283324d5
3
+ metadata.gz: 930c947b9435c61c4faf7651b4539eb6eebc82a583b06b1b50e8f9323dfaa27f
4
+ data.tar.gz: 338e6dd2b51a04f554093975d8ed3428a0a7e844a11b3174a6b7cd8b5f55aec4
5
5
  SHA512:
6
- metadata.gz: 4880a671668b3bc46413dbd45d42e30b8c61ab5dcacfef7ad012e258afb319f121f7039f3edb4ca37e50270d34edb0513d7b233365619c5e8ac242ae17142153
7
- data.tar.gz: 0dfd22a3c555b0769aae9c880b96894df152b6493e932fc9d3d274cca1dad6ed9b467cb912f616e3ffd4a23c64e59e59eee936fcd8ae9a705f72ce2c4fb4905c
6
+ metadata.gz: 7010f156ff38a3d21c3ad228a51562dd23a976b80d4a0548bb8de34de60b62112be5c236390f9c52870537f5973ac0f56f5f3025af24738b28073b1afe0f575b
7
+ data.tar.gz: a837ee46c8ee443fe6ca5276125d1d57027adaedd22980b9b390f03001ab05df29d7ebfe2e8a1afd98540e878176b688b4f800284b1f9515a33fd38f7f923d4b
data/_config.yml CHANGED
@@ -161,7 +161,7 @@ with_link_decorator_data:
161
161
 
162
162
  with_heading_anchor: true
163
163
  with_heading_anchor_data:
164
- icon: "fa-solid fa-link"
164
+ icon: "fa-solid fa-hashtag"
165
165
  copy_success_message: "Copied!"
166
166
  reset_delay: 2000
167
167
 
@@ -29,6 +29,12 @@ properties:
29
29
  description: >-
30
30
  Specifies the version of the Back to Top addon to load from the CDN
31
31
  (e.g., `7.2.1`).
32
+ script_integrity:
33
+ type: string
34
+ default: "sha384-vPjvei7c1a3IpCr0kkDEOMRmlCHcv8REJw1B2eKJM55swier62xiYRVistfMKEUj"
35
+ description: >-
36
+ SRI hash for the vanilla-back-to-top script loaded from the CDN.
37
+ Must be updated when `version` changes.
32
38
  diameter:
33
39
  type: string
34
40
  default: "56"
@@ -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
@@ -18,21 +18,21 @@ properties:
18
18
  properties:
19
19
  version:
20
20
  type: string
21
- default: "v/bs5/jq-3.7.0/dt-2.3.5"
21
+ default: "v/bs5/jq-3.7.0/dt-2.3.8"
22
22
  description: >-
23
23
  The specific version and dependencies string for the compressed
24
24
  and minified DataTables distribution (e.g., `v/bs5/jq-3.7.0/dt-2.3.5`).
25
25
  This value is sourced from the DataTables [download page](https://datatables.net/download/).
26
26
  css_integrity:
27
27
  type: string
28
- default: "sha384-X4ObCG8fB8SK+9d3GgWfrrKjO7nk3Q2PrwyEKa4Nx78Su/v2xEBtCnJ9kRP+gHhi"
28
+ default: "sha384-nD9P196GmYuiIASpxI7+7/0LqD6BBA74CfgIOSQUo7brmKKeph8lSEMm2sGgSAvK"
29
29
  description: >-
30
30
  The Subresource Integrity (SRI) CSS checksum (`sha384-...`) for the
31
31
  specific DataTables version used. This is essential for ensuring the integrity
32
32
  of the loaded CSS resource.
33
33
  script_integrity:
34
34
  type: string
35
- default: "sha384-nhDlWXAURrLQOkCo8hXDhpFWZjzFzX/udlaGLd8PDMKvv67k6YMfex2pZjLU6o2U"
35
+ default: "sha384-pszF7QvU8ChuuhQBJGIvzVEcojfpYqQOVG2PaXES4M4Mcn+1CqfQ4r1b/mpdtn/6"
36
36
  description: >-
37
37
  The Subresource Integrity (SRI) JavaScript checksum (`sha384-...`)
38
38
  for the specific DataTables version used. This ensures the integrity of
@@ -0,0 +1,19 @@
1
+ title: Head Component Configuration
2
+ description: >-
3
+ Schema for the head component. The head component is a layout coordinator
4
+ that assembles the HTML <head> section by conditionally including
5
+ sub-components (OGP, Font Awesome, Highlight.js, DataTables, Breaking News,
6
+ Back to Top, Copy Value, Heading Anchor). Each sub-component is configured
7
+ through its own schema. Only properties exclusive to the head component
8
+ itself are defined here.
9
+ type: object
10
+ properties:
11
+ theme_color:
12
+ type: string
13
+ default: "#A54C93"
14
+ description: >-
15
+ Browser chrome color for mobile browsers (Chrome on Android, Safari on iOS).
16
+ Used by the `<meta name="theme-color">` tag. Should match `theme_color`
17
+ in the site's `site.webmanifest`. Resolved from `page.theme_color` first,
18
+ then `site.theme_color`, then this default.
19
+ additionalProperties: false
@@ -1,4 +1,2 @@
1
1
  ---
2
- icon: "fa-solid fa-link"
3
- copy_success_message: "Copied!"
4
- reset_delay: 2000
2
+ icon: "fa-solid fa-hashtag"
@@ -17,7 +17,7 @@ properties:
17
17
  icon:
18
18
  type: string
19
19
  description: Font Awesome icon classes applied to the anchor icon element.
20
- default: "fa-solid fa-link"
20
+ default: "fa-solid fa-hashtag"
21
21
  icon_size:
22
22
  type: string
23
23
  description: Font Awesome size modifier appended after the icon classes.
@@ -30,6 +30,36 @@ properties:
30
30
  description: >-
31
31
  The specific version of the Highlight.js library being loaded
32
32
  (e.g., `11.11.1`).
33
+ css_integrity:
34
+ type: string
35
+ default: "sha384-4Y0nObtF3CbKnh+lpzmAVdAMtQXl+ganWiiv73RcGVdRdfVIya8Cao1C8ZsVRRDz"
36
+ description: >-
37
+ SRI hash for the Highlight.js theme CSS loaded from cdnjs. Must be
38
+ updated when `version` or `theme` changes.
39
+ script_integrity:
40
+ type: string
41
+ default: "sha384-RH2xi4eIQ/gjtbs9fUXM68sLSi99C7ZWBRX1vDrVv6GQXRibxXLbwO2NGZB74MbU"
42
+ description: >-
43
+ Subresource Integrity (SRI) hash for the Highlight.js script loaded
44
+ from cdnjs. Must be updated when `version` changes.
45
+ copy_version:
46
+ type: string
47
+ default: "1.0.6"
48
+ description: >-
49
+ Version of the highlightjs-copy plugin loaded from unpkg
50
+ (e.g., `1.0.6`).
51
+ copy_script_integrity:
52
+ type: string
53
+ default: "sha384-0/jh9+ifwJ5mqtDZ+DWdwgFjZ8I4HIfXqaWJi2mdeAwy8aUPlw5dTYNsqAqNE4yD"
54
+ description: >-
55
+ SRI hash for the highlightjs-copy plugin script. Must be updated
56
+ when `copy_version` changes.
57
+ copy_css_integrity:
58
+ type: string
59
+ default: "sha384-jx4j2QNE8PcYHQikjfTfY6TM0sYVodTr0OGqUfAR6bKYJBgW91lTieqkghTu9+Kk"
60
+ description: >-
61
+ SRI hash for the highlightjs-copy plugin stylesheet. Must be updated
62
+ when `copy_version` changes.
33
63
  copy_button_icons:
34
64
  type: object
35
65
  description: >-
@@ -0,0 +1,24 @@
1
+ ---
2
+ locale: en_US
3
+ og:
4
+ type: website
5
+ title: true
6
+ url: true
7
+ description: true
8
+ logo: /assets/icons/apple-touch-icon.png
9
+ image:
10
+ url: true
11
+ alt: The CentOS Project
12
+ type: image/png
13
+ width: 1200
14
+ height: 630
15
+ twitter:
16
+ card: summary_large_image
17
+ site: "@CentOS"
18
+ creator: "@CentOS"
19
+ title: true
20
+ url: true
21
+ description: true
22
+ image:
23
+ url: true
24
+ alt: The CentOS Project
@@ -59,7 +59,7 @@ properties:
59
59
  description: The height of the image in pixels via the `og:image:height` tag.
60
60
  alt:
61
61
  type: string
62
- default: "centos-social-share.png"
62
+ default: "The CentOS Project"
63
63
  description: A description of the image for accessibility via the `og:image:alt` tag.
64
64
  required:
65
65
  - url
@@ -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`).
@@ -126,27 +140,13 @@ properties:
126
140
  default: summary_large_image
127
141
  description: Defines the Twitter Card type via the `twitter:card` tag (e.g., `summary`, `summary_large_image`).
128
142
  site:
129
- type: object
130
- description: The Twitter account of the website via the `twitter:site` tag.
131
- properties:
132
- id:
133
- type: string
134
- default: "@CentOS"
135
- description: The site's Twitter handle (e.g., `@CentOS`).
136
- required:
137
- - id
138
- additionalProperties: false
143
+ type: string
144
+ default: "@CentOS"
145
+ description: The website's Twitter handle via the `twitter:site` tag (e.g., `@CentOS`).
139
146
  creator:
140
- type: object
141
- description: The Twitter account of the content creator via the `twitter:creator` tag.
142
- properties:
143
- id:
144
- type: string
145
- default: "@CentOS"
146
- description: The creator's Twitter handle (e.g., `@CentOS`).
147
- required:
148
- - id
149
- additionalProperties: false
147
+ type: string
148
+ default: "@CentOS"
149
+ description: The content creator's Twitter handle via the `twitter:creator` tag (e.g., `@CentOS`).
150
150
  image:
151
151
  type: object
152
152
  description: Configuration for the main image used in the Twitter Card (`twitter:image`).
@@ -175,7 +175,7 @@ properties:
175
175
  description: The height of the image in pixels.
176
176
  alt:
177
177
  type: string
178
- default: "centos-social-share.png"
178
+ default: "The CentOS Project"
179
179
  description: The image description for accessibility.
180
180
  required:
181
181
  - url
@@ -183,4 +183,10 @@ properties:
183
183
  - height
184
184
  additionalProperties: false
185
185
  additionalProperties: false
186
+ locale:
187
+ type: string
188
+ default: "en_US"
189
+ description: >-
190
+ Locale of the content in language_TERRITORY format (e.g., `en_US`, `es_ES`).
191
+ Used by the `og:locale` tag. Should match the site's primary language.
186
192
  additionalProperties: false
@@ -47,19 +47,27 @@ Data Source Hierarchy (priority):
47
47
  {%- comment %} --- Defaults --- {% endcomment %}
48
48
  {%- assign backtotop_cdn = with_backtotop_data.cdn | default: with_backtotop_schema.cdn.default %}
49
49
  {%- assign backtotop_version = with_backtotop_data.version | default: with_backtotop_schema.version.default %}
50
+ {%- assign backtotop_script_integrity = with_backtotop_data.script_integrity | default: with_backtotop_schema.script_integrity.default %}
50
51
  {%- assign backtotop_diameter = with_backtotop_data.diameter | default: with_backtotop_schema.diameter.default %}
51
52
  {%- assign backtotop_background_color = with_backtotop_data.background_color | default: with_backtotop_schema.background_color.default %}
52
53
  {%- assign backtotop_text_color = with_backtotop_data.text_color | default: with_backtotop_schema.text_color.default %}
53
54
 
54
55
  {%- comment %} --- HTML --- {% endcomment %}
55
56
  <!-- Load vanilla-back-to-top library from CDN -->
56
- <script src="{{ backtotop_cdn }}/vanilla-back-to-top@{{ backtotop_version }}/dist/vanilla-back-to-top.min.js"></script>
57
+ <script src="{{ backtotop_cdn }}/vanilla-back-to-top@{{ backtotop_version }}/dist/vanilla-back-to-top.min.js" integrity="{{ backtotop_script_integrity }}" crossorigin="anonymous" referrerpolicy="no-referrer" defer></script>
57
58
 
58
59
  <!-- Initialize back-to-top button with configuration via data attributes -->
59
60
  <script id="centos-backtop"
61
+ {%- if with_backtotop_data.diameter %}
60
62
  data-diameter="{{ backtotop_diameter }}"
63
+ {%- endif %}
64
+ {%- if with_backtotop_data.background_color %}
61
65
  data-background-color="{{ backtotop_background_color }}"
66
+ {%- endif %}
67
+ {%- if with_backtotop_data.text_color %}
62
68
  data-text-color="{{ backtotop_text_color }}"
63
- src="{{ site.baseurl }}/assets/js/base/backtotop.min.js"></script>
69
+ {%- endif %}
70
+ src="{{ site.baseurl }}/assets/js/base/backtotop.min.js"
71
+ defer></script>
64
72
 
65
73
  {%- 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,6 +31,14 @@ 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
+
40
+ {%- assign with_breadcrumb_schema = site.data.base.breadcrumb_schema.properties.with_breadcrumb_data.properties %}
41
+
31
42
  {%- if with_breadcrumb %}
32
43
 
33
44
  {%- comment %} Use original_url if available (without locale), otherwise use full url {%- endcomment %}
@@ -36,7 +47,7 @@ Data Sources:
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 == '' %}
@@ -64,10 +64,19 @@ Bootstrap 5, FontAwesome 6+, Clipboard API (modern browsers)
64
64
  {%- comment %} --- HTML --- {% endcomment %}
65
65
  <!-- Load Copy Value functionality with configuration via data attributes -->
66
66
  <script id="centos-copyvalue"
67
+ {%- if with_copyvalue_data.reset_delay %}
67
68
  data-reset-delay="{{ copyvalue_reset_delay }}"
69
+ {%- endif %}
70
+ {%- if with_copyvalue_data.checkmark_path %}
68
71
  data-checkmark-path="{{ copyvalue_checkmark_path }}"
72
+ {%- endif %}
73
+ {%- if with_copyvalue_data.checkmark_viewbox %}
69
74
  data-checkmark-viewbox="{{ copyvalue_checkmark_viewbox }}"
75
+ {%- endif %}
76
+ {%- if with_copyvalue_data.success_message %}
70
77
  data-success-message="{{ copyvalue_success_message }}"
71
- src="{{ site.baseurl }}/assets/js/base/copyvalue.min.js"></script>
78
+ {%- endif %}
79
+ src="{{ site.baseurl }}/assets/js/base/copyvalue.min.js"
80
+ defer></script>
72
81
 
73
82
  {%- endif %}
@@ -52,18 +52,23 @@ Data Source Hierarchy (priority):
52
52
  {%- assign datatable_length_menu = with_datatable_data.length_menu | default: with_datatable_schema.length_menu.default %}
53
53
 
54
54
  {%- capture html_datatable_head %}
55
- <link href="https://cdn.datatables.net/{{ datatable_version }}/datatables.min.css" rel="stylesheet" integrity="{{ datatable_css_integrity }}" crossorigin="anonymous" />
55
+ <link href="https://cdn.datatables.net/{{ datatable_version }}/datatables.min.css" rel="stylesheet" integrity="{{ datatable_css_integrity }}" crossorigin="anonymous" referrerpolicy="no-referrer" />
56
56
  {%- endcapture %}
57
57
 
58
58
  {%- capture html_datatable_script %}
59
59
  <!-- DataTables Library -->
60
- <script src="https://cdn.datatables.net/{{ datatable_version }}/datatables.min.js" integrity="{{ datatable_script_integrity }}" crossorigin="anonymous"></script>
60
+ <script src="https://cdn.datatables.net/{{ datatable_version }}/datatables.min.js" integrity="{{ datatable_script_integrity }}" crossorigin="anonymous" referrerpolicy="no-referrer" defer></script>
61
61
 
62
62
  <!-- Initialize DataTables with configuration via data attributes -->
63
63
  <script id="centos-datatable"
64
+ {%- if with_datatable_data.page_length %}
64
65
  data-page-length="{{ datatable_page_length }}"
66
+ {%- endif %}
67
+ {%- if with_datatable_data.length_menu %}
65
68
  data-length-menu='{{ datatable_length_menu | split: "," | jsonify }}'
66
- src="{{ site.baseurl }}/assets/js/base/datatable.min.js"></script>
69
+ {%- endif %}
70
+ src="{{ site.baseurl }}/assets/js/base/datatable.min.js"
71
+ defer></script>
67
72
  {%- endcapture %}
68
73
 
69
74
  {%- comment %} --- HTML --- {% endcomment %}
@@ -15,7 +15,7 @@ Design Logic:
15
15
  Optional Inputs:
16
16
  - type: "head" for CSS, "script" for JavaScript
17
17
  - version: Font Awesome version (e.g., "6.4.0")
18
- - cdn: CDN base URL (default: unpkg.com)
18
+ - cdn: CDN base URL (default: cdnjs.cloudflare.com)
19
19
  - css_bundle_name, js_bundle_name: Bundle identifiers
20
20
  - css_bundle_integrity, js_bundle_integrity: SRI hashes
21
21
  - data: Font Awesome configuration object
@@ -57,7 +57,7 @@ Data Source Hierarchy (priority):
57
57
  {%- endcapture %}
58
58
 
59
59
  {%- capture html_fontawesome_script %}
60
- <script src="{{ fontawesome_cdn }}/{{ fontawesome_version }}/js/{{ fontawesome_js_bundle_name }}.min.js" integrity="{{ fontawesome_js_bundle_integrity }}" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
60
+ <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>
61
61
  {%- endcapture %}
62
62
 
63
63
  {%- comment %} --- HTML --- {% endcomment %}
@@ -5,10 +5,10 @@
5
5
  {%- assign with_footer_data = include.data
6
6
  | default: page.with_footer_data
7
7
  | default: site.data.footer
8
- | default: site.data.base.partials.footer
8
+ | default: site.data.base.footer
9
9
  %}
10
10
 
11
- {%- assign with_footer_schema = site.data.base.partials.footer_schema.properties.with_footer_data.properties %}
11
+ {%- assign with_footer_schema = site.data.base.footer_schema.properties.with_footer_data.properties %}
12
12
 
13
13
  {%- assign footer_brand_image = with_footer_data.brand_image | default: with_footer_schema.brand_image.default %}
14
14
  {%- assign footer_brand_image_class = with_footer_data.brand_image_class | default: with_footer_schema.brand_image_class.default %}
@@ -6,13 +6,15 @@ icons, fonts, and conditional library includes.
6
6
  ================================================================================
7
7
 
8
8
  Design Logic:
9
- - Comprehensive meta tags: charset, viewport, responsive design
9
+ - Comprehensive meta tags: charset, viewport, referrer policy, description, theme-color
10
10
  - Dynamic title generation: page title + site title
11
- - Favicon support: multiple formats (16x16, 32x32, SVG, Apple Touch)
12
- - Google Fonts: Montserrat and Source Code Pro preloaded
11
+ - Favicon support: multiple formats (16x16, 32x32, SVG with type, Apple Touch)
12
+ - Google Fonts: Montserrat (5 weights) and Source Code Pro (2 weights) via async stylesheet
13
13
  - Breakingnews scroll offset: dynamic CSS calculation
14
- - Conditional includes: OGP, Font Awesome, Highlight.js, DataTables
14
+ - Conditional includes: OGP, Highlight.js, DataTables, FontAwesome (SVG+JS)
15
15
  - CSS prioritization: custom stylesheet last for override
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
16
18
 
17
19
  Required Inputs:
18
20
  - page.title: Current page title
@@ -20,31 +22,54 @@ Required Inputs:
20
22
  - site.baseurl: Base URL for asset paths
21
23
 
22
24
  Optional Inputs:
23
- - page.with_ogp, page.with_fontawesome: Include OGP/Font Awesome (boolean)
25
+ - page.with_ogp, page.with_fontawesome: Include OGP/Font Awesome SVG+JS (boolean)
24
26
  - page.with_breakingnews, page.with_highlight: Include breaking news/highlight
25
27
  - page.with_datatable: Include DataTables (boolean)
26
28
  - page.with_breakingnews_data: Array of breaking news items
29
+ - page.with_backtotop: Include back-to-top button (boolean)
30
+ - page.with_copyvalue: Include copy-to-clipboard behavior (boolean)
31
+ - page.with_heading_anchor: Include heading anchor copy behavior (boolean)
32
+ - page.theme_color, site.theme_color: Override browser chrome color (default: #A54C93)
27
33
  ================================================================================
28
34
  {% endcomment %}
29
35
 
30
36
  <head>
37
+ <meta charset="utf-8" />
38
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
39
+ <meta name="referrer" content="strict-origin-when-cross-origin" />
31
40
  {% if page.title == site.title -%}
32
41
  <title>{{ page.title }}</title>
33
42
  {% else -%}
34
43
  <title>{{ page.title }} - {{ site.title }}</title>
35
44
  {% endif -%}
36
- <meta charset="utf-8" />
37
- <meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no" />
45
+ <meta name="description" content="{{ page.description | default: page.excerpt | default: page.title_lead | default: site.description | strip_html | truncate: 160 }}" />
38
46
  {% include base/ogp.html.liquid %}
39
47
  <link rel="icon" href="{{ site.baseurl }}/assets/icons/favicon-16.png" sizes="16x16" />
40
48
  <link rel="icon" href="{{ site.baseurl }}/assets/icons/favicon-32.png" sizes="32x32" />
41
- <link rel="icon" href="{{ site.baseurl }}/assets/icons/favicon.svg" sizes="any" />
49
+ <link rel="icon" href="{{ site.baseurl }}/assets/icons/favicon.svg" type="image/svg+xml" sizes="any" />
42
50
  <link rel="apple-touch-icon" href="{{ site.baseurl }}/assets/icons/apple-touch-icon.png" sizes="180x180" />
43
51
  <link rel="manifest" href="{{ site.baseurl }}/site.webmanifest" />
44
- <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
52
+ {%- assign head_theme_color = page.theme_color | default: site.theme_color | default: '#A54C93' %}
53
+ <meta name="theme-color" content="{{ head_theme_color }}" />
45
54
  <link rel="preconnect" href="https://fonts.googleapis.com" />
46
- <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Montserrat:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&family=Source+Code+Pro:ital,wght@0,400;0,500;0,700;1,400;1,500;1,700&display=swap" />
47
- <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Source+Code+Pro:ital,wght@0,400;0,500;0,700;1,400;1,500;1,700&display=swap" />
55
+ <link rel="dns-prefetch" href="https://fonts.googleapis.com" />
56
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
57
+ <link rel="dns-prefetch" href="https://fonts.gstatic.com" />
58
+ {%- if page.with_fontawesome or page.with_highlight %}
59
+ <link rel="preconnect" href="https://cdnjs.cloudflare.com" crossorigin />
60
+ <link rel="dns-prefetch" href="https://cdnjs.cloudflare.com" />
61
+ {%- endif %}
62
+ {%- if page.with_highlight or page.with_backtotop %}
63
+ <link rel="preconnect" href="https://unpkg.com" crossorigin />
64
+ <link rel="dns-prefetch" href="https://unpkg.com" />
65
+ {%- endif %}
66
+ {%- if page.with_datatable %}
67
+ <link rel="preconnect" href="https://cdn.datatables.net" crossorigin />
68
+ <link rel="dns-prefetch" href="https://cdn.datatables.net" />
69
+ {%- endif %}
70
+ <link rel="preload" href="{{ site.baseurl }}/assets/js/bootstrap.bundle.min.js" as="script" fetchpriority="high" />
71
+ <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
+ <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>
48
73
  <link rel="stylesheet" href="{{ site.baseurl }}/assets/css/base/stylesheet.min.css" />
49
74
  {%- comment %}
50
75
  Dynamic Breaking News Offset CSS
@@ -87,7 +112,22 @@ Uses CSS custom properties for cleaner, more maintainable dynamic styling.
87
112
  }
88
113
  </style>
89
114
  {%- endif %}
90
- {% include base/fontawesome.html.liquid type="head" %}
91
- {% include base/highlight.html.liquid type="head" %}
92
- {% include base/datatable.html.liquid type="head" %}
115
+
116
+ {%- comment %} CSS dependencies {%- endcomment %}
117
+ {%- include base/highlight.html.liquid type="head" %}
118
+ {%- include base/datatable.html.liquid type="head" %}
119
+
120
+ {%- comment %} JavaScript base — Bootstrap must execute before all component scripts {%- endcomment %}
121
+ <script src="{{ site.baseurl }}/assets/js/bootstrap.bundle.min.js" defer></script>
122
+ <script src="{{ site.baseurl }}/assets/js/base/init-tooltips.min.js" defer></script>
123
+
124
+ {%- comment %} JavaScript optional library extensions {%- endcomment %}
125
+ {%- include base/fontawesome.html.liquid type="script" %}
126
+ {%- include base/highlight.html.liquid type="script" %}
127
+ {%- include base/datatable.html.liquid type="script" %}
128
+
129
+ {%- comment %} JavaScript UI behavior components — depend on Bootstrap and FontAwesome SVG+JS {%- endcomment %}
130
+ {%- include base/backtotop.html.liquid %}
131
+ {%- include base/copyvalue.html.liquid %}
132
+ {%- include base/heading_anchor.html.liquid %}
93
133
  </head>
@@ -6,8 +6,8 @@ icons that jekyll-link-decorator injects inside h1–h6 elements. Clicking an
6
6
  anchor icon copies the full page URL (origin + pathname + fragment) to the
7
7
  clipboard, with a transient fa-check icon as visual feedback.
8
8
 
9
- Recommended Usage (in partials/script.html.liquid or layout):
10
- {% include heading_anchor.html.liquid %}
9
+ Recommended Usage (in head.html.liquid):
10
+ {%- include base/heading_anchor.html.liquid %}
11
11
 
12
12
  The heading anchor icons themselves are injected by the jekyll-link-decorator
13
13
  Ruby plugin. This include only loads the JavaScript that powers copy behaviour.
@@ -55,8 +55,13 @@ jekyll-link-decorator gem, FontAwesome 6+, Clipboard API (modern browsers)
55
55
  {%- comment %} --- HTML --- {% endcomment %}
56
56
  <!-- Load Heading Anchor functionality with configuration via data attributes -->
57
57
  <script id="centos-heading-anchor"
58
+ {%- if with_heading_anchor_data.reset_delay %}
58
59
  data-reset-delay="{{ heading_anchor_reset_delay }}"
60
+ {%- endif %}
61
+ {%- if with_heading_anchor_data.copy_success_message %}
59
62
  data-success-message="{{ heading_anchor_success_message }}"
60
- src="{{ site.baseurl }}/assets/js/base/heading-anchor.min.js"></script>
63
+ {%- endif %}
64
+ src="{{ site.baseurl }}/assets/js/base/heading-anchor.min.js"
65
+ defer></script>
61
66
 
62
67
  {%- endif -%}
@@ -41,14 +41,19 @@ Data Source Hierarchy (priority):
41
41
 
42
42
  {%- if with_highlight %}
43
43
 
44
- {%- assign highlight_theme = with_highlight_data.theme | default: with_highlight_schema.theme.default %}
45
- {%- assign highlight_version = with_highlight_data.version | default: with_highlight_schema.version.default %}
46
- {%- assign copy_icon_svg = with_highlight_data.copy_button_icons.copy.svg | default: with_highlight_schema.copy_button_icons.properties.copy.properties.svg.default %}
47
- {%- assign success_icon_svg = with_highlight_data.copy_button_icons.success.svg | default: with_highlight_schema.copy_button_icons.properties.success.properties.svg.default %}
44
+ {%- assign highlight_theme = with_highlight_data.theme | default: with_highlight_schema.theme.default %}
45
+ {%- assign highlight_version = with_highlight_data.version | default: with_highlight_schema.version.default %}
46
+ {%- assign highlight_css_sri = with_highlight_data.css_integrity | default: with_highlight_schema.css_integrity.default %}
47
+ {%- assign highlight_script_sri = with_highlight_data.script_integrity | default: with_highlight_schema.script_integrity.default %}
48
+ {%- assign copy_version = with_highlight_data.copy_version | default: with_highlight_schema.copy_version.default %}
49
+ {%- assign copy_script_sri = with_highlight_data.copy_script_integrity | default: with_highlight_schema.copy_script_integrity.default %}
50
+ {%- assign copy_css_sri = with_highlight_data.copy_css_integrity | default: with_highlight_schema.copy_css_integrity.default %}
51
+ {%- assign copy_icon_svg = with_highlight_data.copy_button_icons.copy.svg | default: with_highlight_schema.copy_button_icons.properties.copy.properties.svg.default %}
52
+ {%- assign success_icon_svg = with_highlight_data.copy_button_icons.success.svg | default: with_highlight_schema.copy_button_icons.properties.success.properties.svg.default %}
48
53
 
49
54
  {%- capture html_highlight_head %}
50
- <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/{{ highlight_version }}/styles/{{ highlight_theme | replace_first: 'base16-', 'base16/' | default: 'default' }}.min.css" />
51
- <link rel="stylesheet" href="https://unpkg.com/highlightjs-copy@1.0.6/dist/highlightjs-copy.min.css" />
55
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/{{ highlight_version }}/styles/{{ highlight_theme | replace_first: 'base16-', 'base16/' | default: 'default' }}.min.css" integrity="{{ highlight_css_sri }}" crossorigin="anonymous" referrerpolicy="no-referrer" />
56
+ <link rel="stylesheet" href="https://unpkg.com/highlightjs-copy@{{ copy_version }}/dist/highlightjs-copy.min.css" integrity="{{ copy_css_sri }}" crossorigin="anonymous" referrerpolicy="no-referrer" />
52
57
  <!-- Highlight.js Copy Button Icon Customization (from schema) -->
53
58
  <style>
54
59
  .hljs-copy-button:not([data-copied="true"])::before {
@@ -62,10 +67,10 @@ Data Source Hierarchy (priority):
62
67
 
63
68
  {%- capture html_highlight_script %}
64
69
  <!-- Highlight.js Library and Copy Plugin -->
65
- <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/{{ highlight_version }}/highlight.min.js"></script>
66
- <script src="https://unpkg.com/highlightjs-copy@1.0.6/dist/highlightjs-copy.min.js"></script>
70
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/{{ highlight_version }}/highlight.min.js" integrity="{{ highlight_script_sri }}" crossorigin="anonymous" referrerpolicy="no-referrer" defer></script>
71
+ <script src="https://unpkg.com/highlightjs-copy@{{ copy_version }}/dist/highlightjs-copy.min.js" integrity="{{ copy_script_sri }}" crossorigin="anonymous" referrerpolicy="no-referrer" defer></script>
67
72
  <!-- Initialize Highlight.js -->
68
- <script src="{{ site.baseurl }}/assets/js/base/highlight.min.js"></script>
73
+ <script src="{{ site.baseurl }}/assets/js/base/highlight.min.js" defer></script>
69
74
  {%- endcapture %}
70
75
 
71
76
  {%- assign type = include.type %}
@@ -26,7 +26,7 @@ Data Source Hierarchy (priority):
26
26
  1. include.data
27
27
  2. page.with_navbar_data
28
28
  3. site.data.navbar
29
- 4. site.data.base.partials.navbar
29
+ 4. site.data.base.navbar
30
30
  ================================================================================
31
31
  {% endcomment %}
32
32
 
@@ -37,10 +37,10 @@ Data Source Hierarchy (priority):
37
37
  {%- assign with_navbar_data = include.data
38
38
  | default: page.with_navbar_data
39
39
  | default: site.data.navbar
40
- | default: site.data.base.partials.navbar
40
+ | default: site.data.base.navbar
41
41
  %}
42
42
 
43
- {%- assign with_navbar_schema = site.data.base.partials.navbar_schema.properties.with_navbar_data.properties %}
43
+ {%- assign with_navbar_schema = site.data.base.navbar_schema.properties.with_navbar_data.properties %}
44
44
 
45
45
  {%- if with_navbar %}
46
46