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,7 @@
1
+ {%- assign content_schema_key = "content_schema" %}
2
+ {%- assign content_schema = include.schema
3
+ | default: site.data[content_schema_key]
4
+ | default: site.data.base[content_schema_key]
5
+ -%}
6
+
7
+ {{ content }}
@@ -0,0 +1,70 @@
1
+ {% comment %}
2
+ ================================================================================
3
+ Template: Copyright Footer Component
4
+ Purpose: Renders copyright notice with author name and optional legal links.
5
+ Shows dynamic year, author, and links to Terms of Service, Privacy Policy, etc.
6
+ ================================================================================
7
+
8
+ Design Logic:
9
+ - Dynamic year: automatically uses current year from site.time
10
+ - Legal links looping: flexible number of links in footer
11
+ - Reusable link component: consistent styling
12
+ - Capture-based rendering: builds complex link string before output
13
+ - Border separator styling: visual dividers between links
14
+
15
+ Required Inputs:
16
+ - author: Copyright holder name (e.g., "The CentOS Project")
17
+
18
+ Optional Inputs:
19
+ - legals: Array of legal link objects
20
+ - name: Link text (e.g., "Terms of Service")
21
+ - link: URL for legal document
22
+ - color: Link color (defaults to light)
23
+ - icon: Icon class (optional)
24
+ - class: Custom CSS classes (optional)
25
+
26
+ Data Source Hierarchy (priority):
27
+ 1. include.data
28
+ 2. page.with_copyright_data
29
+ 3. site.data.copyright
30
+ 4. site.data.base.copyright
31
+ ================================================================================
32
+ {% endcomment %}
33
+
34
+ {%- assign with_copyright = include.with_copyright
35
+ | default: page.with_copyright
36
+ %}
37
+
38
+ {%- assign with_copyright_data = include.data
39
+ | default: page.with_copyright_data
40
+ | default: site.data.copyright
41
+ | default: site.data.base.copyright
42
+ %}
43
+
44
+ {%- assign with_copyright_schema = site.data.base.copyright_schema.properties.with_copyright_data.properties %}
45
+
46
+ {%- if with_copyright %}
47
+
48
+ {%- comment %} === Presentation === {% endcomment %}
49
+ {%- comment %} --- Defaults --- {% endcomment %}
50
+ {%- assign copyright_author = with_copyright_data.author | default: with_copyright_schema.author.default %}
51
+ {%- assign copyright_legals = with_copyright_data.legals | default: with_copyright_schema.legals.default %}
52
+
53
+ {%- capture copyright_links -%}
54
+ {%- for item in copyright_legals -%}
55
+ {%- assign copyright_link_class = item.class | default: "link link-offset-3 link-offset-3-hover link-underline-primary link-underline-opacity-0 link-underline-opacity-100-hover border-start ms-2 ps-2 link-light" %}
56
+ {%- include base/link.html.liquid
57
+ class = copyright_link_class
58
+ name = item.name
59
+ link = item.link
60
+ color = item.color
61
+ role = item.role
62
+ icon = item.icon
63
+ icon_position = item.icon_position
64
+ -%}
65
+ {%- endfor -%}
66
+ {%- endcapture -%}
67
+
68
+ {%- comment %} --- HTML --- {% endcomment %}
69
+ <p class="my-1">Copyright &copy; {{ site.time | date: "%Y" }} {{ copyright_author }} {{ copyright_links }}</p>
70
+ {%- endif -%}
@@ -0,0 +1,82 @@
1
+ {% comment %}
2
+ ================================================================================
3
+ Template: Copy Value Component
4
+ Purpose: Copy to clipboard with visual feedback (checkmark + tooltip).
5
+ Auto-detects and handles both escaped and unescaped values.
6
+ ================================================================================
7
+
8
+ Recommended Usage (in template):
9
+ <span role="button" class="copy-btn" data-copy-value="{{ command | escape }}"
10
+ data-bs-toggle="tooltip" data-bs-title="Copy command">
11
+ <span class="fa-regular fa-copy"></span>
12
+ </span>
13
+
14
+ Strategic Design Logic:
15
+ - Armored implementation: handles escaped and unescaped values
16
+ - HTML entity detection: decodes &quot;, &amp;, &#39; automatically
17
+ - Visual feedback: checkmark icon + success tooltip
18
+ - Auto-reset: returns to original state after delay
19
+ - Clipboard API: native browser copy functionality
20
+
21
+ Required Inputs (from HTML element):
22
+ - class="copy-btn": Element to attach handler
23
+ - data-copy-value: Text to copy to clipboard
24
+
25
+ Optional Inputs (from data objects):
26
+ - reset_delay: Milliseconds before reset (default varies by schema)
27
+ - checkmark_path: SVG path for success icon
28
+ - checkmark_viewbox: SVG viewBox for success icon
29
+ - success_message: Tooltip message on success
30
+
31
+ Data Source Hierarchy (in priority order):
32
+ 1. include.data - Explicitly passed configuration
33
+ 2. page.with_copyvalue_data - Page front matter
34
+ 3. site.data.copyvalue - Site configuration
35
+ 4. site.data.base.copyvalue - Theme defaults
36
+
37
+ Dependencies:
38
+ Bootstrap 5, FontAwesome 6+, Clipboard API (modern browsers)
39
+ ================================================================================
40
+ {% endcomment %}
41
+
42
+ {%- assign with_copyvalue = include.with_copyvalue
43
+ | default: page.with_copyvalue
44
+ %}
45
+
46
+ {%- assign with_copyvalue_data = include.data
47
+ | default: page.with_copyvalue_data
48
+ | default: site.data.copyvalue
49
+ | default: site.data.base.copyvalue
50
+ %}
51
+
52
+ {%- assign with_copyvalue_schema = site.data.base.copyvalue_schema.properties.with_copyvalue_data.properties %}
53
+
54
+ {%- if with_copyvalue %}
55
+
56
+ {%- comment %} === Presentation === {% endcomment %}
57
+
58
+ {%- comment %} --- Defaults --- {% endcomment %}
59
+ {%- assign copyvalue_reset_delay = with_copyvalue_data.reset_delay | default: with_copyvalue_schema.reset_delay.default %}
60
+ {%- assign copyvalue_checkmark_path = with_copyvalue_data.checkmark_path | default: with_copyvalue_schema.checkmark_path.default %}
61
+ {%- assign copyvalue_checkmark_viewbox = with_copyvalue_data.checkmark_viewbox | default: with_copyvalue_schema.checkmark_viewbox.default %}
62
+ {%- assign copyvalue_success_message = with_copyvalue_data.success_message | default: with_copyvalue_schema.success_message.default %}
63
+
64
+ {%- comment %} --- HTML --- {% endcomment %}
65
+ <!-- Load Copy Value functionality with configuration via data attributes -->
66
+ <script id="centos-copyvalue"
67
+ {%- if with_copyvalue_data.reset_delay %}
68
+ data-reset-delay="{{ copyvalue_reset_delay }}"
69
+ {%- endif %}
70
+ {%- if with_copyvalue_data.checkmark_path %}
71
+ data-checkmark-path="{{ copyvalue_checkmark_path }}"
72
+ {%- endif %}
73
+ {%- if with_copyvalue_data.checkmark_viewbox %}
74
+ data-checkmark-viewbox="{{ copyvalue_checkmark_viewbox }}"
75
+ {%- endif %}
76
+ {%- if with_copyvalue_data.success_message %}
77
+ data-success-message="{{ copyvalue_success_message }}"
78
+ {%- endif %}
79
+ src="{{ site.baseurl }}/assets/js/base/copyvalue.min.js"
80
+ defer></script>
81
+
82
+ {%- endif %}
@@ -0,0 +1,83 @@
1
+ {% comment %}
2
+ ================================================================================
3
+ Template: DataTables Library Initialization Component
4
+ Purpose: Loads DataTables jQuery plugin from CDN with SRI integrity checks.
5
+ Initializes DataTables on all .dataTable elements with responsive design,
6
+ pagination, searching, and sorting.
7
+ ================================================================================
8
+
9
+ Design Logic:
10
+ - CDN-based library loading with SRI integrity checks
11
+ - Responsive table design for mobile devices
12
+ - Smart pagination: only if table has >10 rows
13
+ - Automatic element detection: targets all .dataTable classes
14
+ - jQuery dependency: requires jQuery loaded first
15
+
16
+ Optional Inputs:
17
+ - type: "head" for CSS include, "script" for JavaScript
18
+ - version: DataTables version (e.g., "1.13.7")
19
+ - css_integrity, script_integrity: SRI integrity hashes
20
+ - page_length: Default rows per page (default: 10)
21
+ - length_menu: Pagination options
22
+ - data: DataTables configuration object
23
+
24
+ Data Source Hierarchy (priority):
25
+ 1. include.data
26
+ 2. page.with_datatable_data
27
+ 3. site.data.datatable
28
+ 4. site.data.base.datatable
29
+ ================================================================================
30
+ {% endcomment %}
31
+
32
+ {%- assign with_datatable = include.with_datatable
33
+ | default: page.with_datatable
34
+ %}
35
+
36
+ {%- assign with_datatable_data = include.data
37
+ | default: page.with_datatable_data
38
+ | default: site.data.datatable
39
+ | default: site.data.base.datatable
40
+ %}
41
+
42
+ {%- assign with_datatable_schema = site.data.base.datatable_schema.properties.with_datatable_data.properties %}
43
+
44
+ {%- if with_datatable %}
45
+
46
+ {%- comment %} === Presentation === {% endcomment %}
47
+ {%- comment %} --- Defaults --- {% endcomment %}
48
+ {%- assign datatable_version = with_datatable_data.version | default: with_datatable_schema.version.default %}
49
+ {%- assign datatable_css_integrity = with_datatable_data.css_integrity | default: with_datatable_schema.css_integrity.default %}
50
+ {%- assign datatable_script_integrity = with_datatable_data.script_integrity | default: with_datatable_schema.script_integrity.default %}
51
+ {%- assign datatable_page_length = with_datatable_data.page_length | default: with_datatable_schema.page_length.default %}
52
+ {%- assign datatable_length_menu = with_datatable_data.length_menu | default: with_datatable_schema.length_menu.default %}
53
+
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" referrerpolicy="no-referrer" />
56
+ {%- endcapture %}
57
+
58
+ {%- capture html_datatable_script %}
59
+ <!-- DataTables Library -->
60
+ <script src="https://cdn.datatables.net/{{ datatable_version }}/datatables.min.js" integrity="{{ datatable_script_integrity }}" crossorigin="anonymous" referrerpolicy="no-referrer" defer></script>
61
+
62
+ <!-- Initialize DataTables with configuration via data attributes -->
63
+ <script id="centos-datatable"
64
+ {%- if with_datatable_data.page_length %}
65
+ data-page-length="{{ datatable_page_length }}"
66
+ {%- endif %}
67
+ {%- if with_datatable_data.length_menu %}
68
+ data-length-menu='{{ datatable_length_menu | split: "," | jsonify }}'
69
+ {%- endif %}
70
+ src="{{ site.baseurl }}/assets/js/base/datatable.min.js"
71
+ defer></script>
72
+ {%- endcapture %}
73
+
74
+ {%- comment %} --- HTML --- {% endcomment %}
75
+ {%- assign type = include.type %}
76
+ {%- case type %}
77
+ {%- when "head" %}
78
+ {{ html_datatable_head }}
79
+ {%- when "script" %}
80
+ {{ html_datatable_script }}
81
+ {%- endcase %}
82
+
83
+ {%- endif %}
@@ -0,0 +1,105 @@
1
+ {% comment %}
2
+ ================================================================================
3
+ Template: Event Alerts Component
4
+ Purpose: Renders event announcements as styled alert boxes with date, location,
5
+ description, and optional action links.
6
+ ================================================================================
7
+
8
+ Design Logic:
9
+ - Alert-based styling: consistent with Bootstrap alert components
10
+ - Icon support: visual identification of event type
11
+ - Color coding: color-based categorization
12
+ - Location details: address and city information optional
13
+ - Date/time display: with location suffix if available
14
+ - Optional action link: "Know more" button for details page
15
+ - Multi-event support: loops through event array
16
+
17
+ Required Inputs:
18
+ - title: Event name/title
19
+
20
+ Optional Inputs:
21
+ - description: Event description text
22
+ - date: Event date/time string
23
+ - location: Event location name
24
+ - color: Alert color scheme (default: "secondary")
25
+ - icon: Icon class (default: "fa-solid fa-calendar")
26
+ - link: URL to event details page (optional)
27
+ - data: Array of event objects
28
+
29
+ Data Source Hierarchy (priority):
30
+ 1. include.data
31
+ 2. page.with_event_data
32
+ 3. site.data.event
33
+ 4. site.data.base.event
34
+ ================================================================================
35
+ {% endcomment %}
36
+
37
+ {%- assign with_event = include.with_event
38
+ | default: page.with_event
39
+ %}
40
+
41
+ {%- assign with_event_data = include.data
42
+ | default: page.with_event_data
43
+ | default: site.data.event
44
+ | default: site.data.base.event
45
+ %}
46
+
47
+ {%- if with_event %}
48
+
49
+ {%- assign with_event_schema = site.data.base.event_schema.properties.with_event_data.items.properties %}
50
+
51
+ {%- comment %} === Presentation === {% endcomment %}
52
+ {%- if with_event_data.size > 0 %}
53
+ <div class="mb-3">
54
+ {%- for event in with_event_data %}
55
+ {%- comment %} --- Defaults --- {% endcomment %}
56
+ {%- assign event_address = event.address | default: with_event_schema.address.default %}
57
+ {%- assign event_city = event.city | default: with_event_schema.city.default %}
58
+ {%- assign event_color = event.color | default: with_event_schema.color.default %}
59
+ {%- assign event_location = event.location | default: with_event_schema.location.default %}
60
+ {%- assign event_date = event.date | default: with_event_schema.date.default %}
61
+ {%- assign event_description = event.description | default: with_event_schema.description.default %}
62
+ {%- assign event_icon = event.icon | default: with_event_schema.icon.default %}
63
+ {%- assign event_image_url = event.image_url | default: with_event_schema.image_url.default %}
64
+ {%- assign event_link = event.link | default: with_event_schema.link.default %}
65
+ {%- assign event_title = event.title | default: with_event_schema.title.default %}
66
+
67
+ {%- assign event_btn_class = "btn btn-sm text-nowrap btn-" | append: event_color %}
68
+
69
+ {%- comment %} --- HTML --- {% endcomment %}
70
+ <div class="alert alert-{{ event_color }} rounded mb-1" role="alert">
71
+ <div class="d-flex justify-content-between align-items-start">
72
+ {%- if event_icon != "" %}
73
+ <div class="h6 my-1 me-2"><i class="{{ event_icon }}"></i></div>
74
+ {%- endif %}
75
+ <div class="flex-fill text-start">
76
+ {%- if event_title != "" %}
77
+ <p class="ms-1 fw-bold mb-0">{{ event_title }}</p>
78
+ {%- endif %}
79
+ {%- if event_date != "" %}
80
+ <p class="ms-1 mb-0">{{ event_date }}{% if event_location != "" %} • {{ event_location }}{%- endif %}</p>
81
+ {%- endif %}
82
+ {%- if event_description != "" %}
83
+ <p class="ms-1 mb-0">{{ event_description }}</p>
84
+ {%- endif %}
85
+ </div>
86
+ {%- if event_link != "" %}
87
+ <div class="ms-1">
88
+ {% include base/link.html.liquid
89
+ name = "Know more"
90
+ icon = "fa-solid fa-arrow-right"
91
+ icon_position = "end"
92
+ role = "button"
93
+ class = event_btn_class
94
+ color = event_color
95
+ link = event_link
96
+ %}
97
+ </div>
98
+ {%- endif %}
99
+ </div>
100
+ </div>
101
+ {% endfor %}
102
+ </div>
103
+ {%- endif %}
104
+
105
+ {%- endif -%}
@@ -0,0 +1,91 @@
1
+ {% comment %}
2
+ ================================================================================
3
+ Template: Font Awesome Icon Library Component
4
+ Purpose: Loads Font Awesome icon library CSS and JavaScript from CDN
5
+ with integrity checks.
6
+ ================================================================================
7
+
8
+ Design Logic:
9
+ - CDN-based library loading with SRI integrity verification
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
15
+ - Subresource Integrity (SRI): ensures file hasn't been tampered with
16
+ - Privacy-focused: referrerpolicy="no-referrer"
17
+
18
+ Optional Inputs:
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")
22
+ - cdn: CDN base URL (default: cdnjs.cloudflare.com)
23
+ - css_bundle_name, js_bundle_name: Bundle identifiers
24
+ - css_bundle_integrity, js_bundle_integrity: SRI hashes
25
+ - data: Font Awesome configuration object
26
+
27
+ Data Source Hierarchy (priority):
28
+ 1. include.data
29
+ 2. page.with_fontawesome_data
30
+ 3. site.data.fontawesome
31
+ 4. site.data.base.fontawesome
32
+ ================================================================================
33
+ {% endcomment %}
34
+
35
+ {%- assign with_fontawesome = include.with_fontawesome
36
+ | default: page.with_fontawesome
37
+ %}
38
+
39
+ {%- assign with_fontawesome_data = include.data
40
+ | default: page.with_fontawesome_data
41
+ | default: site.data.fontawesome
42
+ | default: site.data.base.fontawesome
43
+ %}
44
+
45
+ {%- assign with_fontawesome_schema = site.data.base.fontawesome_schema.properties.with_fontawesome_data.properties %}
46
+
47
+ {%- if with_fontawesome %}
48
+
49
+ {%- comment %} === Presentation === {% endcomment %}
50
+
51
+ {%- comment %} --- Defaults --- {% endcomment %}
52
+ {%- assign fontawesome_version = with_fontawesome_data.version | default: with_fontawesome_schema.version.default %}
53
+ {%- assign fontawesome_cdn = with_fontawesome_data.cdn | default: with_fontawesome_schema.cdn.default %}
54
+ {%- assign fontawesome_css_bundle_name = with_fontawesome_data.css_bundle_name | default: with_fontawesome_schema.css_bundle_name.default %}
55
+ {%- assign fontawesome_css_bundle_integrity = with_fontawesome_data.css_bundle_integrity | default: with_fontawesome_schema.css_bundle_integrity.default %}
56
+ {%- assign fontawesome_js_bundle_name = with_fontawesome_data.js_bundle_name | default: with_fontawesome_schema.js_bundle_name.default %}
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 %}
67
+
68
+ {%- capture html_fontawesome_head %}
69
+ {%- if fontawesome_mode == "css" %}
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 %}
72
+ {%- endcapture %}
73
+
74
+ {%- capture html_fontawesome_script %}
75
+ {%- if fontawesome_mode == "svg+js" %}
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 %}
78
+ {%- endcapture %}
79
+
80
+ {%- comment %} --- HTML --- {% endcomment %}
81
+ {%- assign type = include.type %}
82
+ {%- case type %}
83
+ {%- when "preload" %}
84
+ {{ html_fontawesome_preload }}
85
+ {%- when "head" %}
86
+ {{ html_fontawesome_head }}
87
+ {%- when "script" %}
88
+ {{ html_fontawesome_script }}
89
+ {%- endcase %}
90
+
91
+ {% endif %}
@@ -0,0 +1,69 @@
1
+ {%- assign with_footer = include.with_footer
2
+ | default: page.with_footer
3
+ %}
4
+
5
+ {%- assign with_footer_data = include.data
6
+ | default: page.with_footer_data
7
+ | default: site.data.footer
8
+ | default: site.data.base.footer
9
+ %}
10
+
11
+ {%- if with_footer -%}
12
+
13
+ {%- assign with_footer_schema = site.data.base.footer_schema.properties.with_footer_data.properties %}
14
+
15
+ {%- assign footer_brand_image = with_footer_data.brand_image | default: with_footer_schema.brand_image.default %}
16
+ {%- assign footer_brand_image_class = with_footer_data.brand_image_class | default: with_footer_schema.brand_image_class.default %}
17
+ {%- assign footer_brand_image_height = with_footer_data.brand_image_height | default: with_footer_schema.brand_image_height.default %}
18
+ {%- assign footer_brand_manifestation = with_footer_data.brand_manifestation | default: with_footer_schema.brand_manifestation.default %}
19
+ {%- assign footer_brand_manifestation_class = with_footer_data.brand_manifestation_class | default: with_footer_schema.brand_manifestation_class.default %}
20
+
21
+ <div class="container">
22
+ <div class="row justify-content-between align-items-start gx-5">
23
+ <div class="col-sm-12 col-lg-4">
24
+ {%- if footer_brand_image != "" %}
25
+ <a class="navbar-brand" href="{{ site.baseurl }}/">
26
+ <img
27
+ class="d-inline-block align-text-middle me-2{% if footer_brand_image_class != "" %} {{ footer_brand_image_class }}{% endif %}"
28
+ src="{{ site.baseurl }}/assets/img/{{ footer_brand_image }}"
29
+ height="{{ footer_brand_image_height }}"
30
+ alt="{{ site.title }}" />
31
+ {%- if footer_brand_manifestation != "" %}
32
+ <span class="d-inline-block align-text-middle fs-6 border-start border-1 border-light opacity-75 ps-3{% if footer_brand_manifestation_class != "" %} {{ footer_brand_manifestation_class }}{% endif %}">{{ footer_brand_manifestation }}</span>
33
+ {%- endif %}
34
+ </a>
35
+ {%- endif %}
36
+ {% if site.description %}
37
+ <p class="mt-2 mb-5">{{ site.description }}</p>
38
+ {% endif %}
39
+
40
+ {% include base/sponsors-carousel.html.liquid -%}
41
+ </div>
42
+
43
+ {% if page.with_shortcut %}
44
+ <div class="col-sm-12 col-lg-5">
45
+ {% include base/shortcut.html.liquid %}
46
+ </div>
47
+ {% endif %}
48
+
49
+ {% if page.with_locales or page.with_social %}
50
+ <div class="col-sm-12 col-lg-3 pb-5">
51
+ {% include base/locales.html.liquid %}
52
+ {% include base/social.html.liquid %}
53
+ </div>
54
+ {% endif %}
55
+
56
+ </div>
57
+ </div>
58
+
59
+ {% if page.with_copyright %}
60
+ <div class="container">
61
+ <div class="row justify-content-between align-items-center py-3">
62
+ <div class="col">
63
+ {% include base/copyright.html.liquid %}
64
+ </div>
65
+ </div>
66
+ </div>
67
+ {% endif %}
68
+
69
+ {%- endif -%}
@@ -0,0 +1,135 @@
1
+ {% comment %}
2
+ ================================================================================
3
+ Template: Page Head Section Component
4
+ Purpose: Generates complete HTML <head> section with meta tags, stylesheets,
5
+ icons, fonts, and conditional library includes.
6
+ ================================================================================
7
+
8
+ Design Logic:
9
+ - Comprehensive meta tags: charset, viewport, referrer policy, description, theme-color
10
+ - Dynamic title generation: page title + site title
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
+ - Breakingnews scroll offset: dynamic CSS calculation
14
+ - Conditional includes: OGP, Highlight.js, DataTables, FontAwesome (SVG+JS)
15
+ - CSS prioritization: custom stylesheet last for override
16
+ - Script loading: Bootstrap base first (defer), then optional extensions, then UI behaviors
17
+ - Bootstrap and FontAwesome preloaded (high-priority fetch); CDN origins preconnected + dns-prefetched per active component
18
+
19
+ Required Inputs:
20
+ - page.title: Current page title
21
+ - site.title: Site name/title
22
+ - site.baseurl: Base URL for asset paths
23
+
24
+ Optional Inputs:
25
+ - page.with_ogp, page.with_fontawesome: Include OGP/Font Awesome SVG+JS (boolean)
26
+ - page.with_breakingnews, page.with_highlight: Include breaking news/highlight
27
+ - page.with_datatable: Include DataTables (boolean)
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)
33
+ ================================================================================
34
+ {% endcomment %}
35
+
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" />
40
+ {% if page.title == site.title -%}
41
+ <title>{{ page.title }}</title>
42
+ {% else -%}
43
+ <title>{{ page.title }} - {{ site.title }}</title>
44
+ {% endif -%}
45
+ <meta name="description" content="{{ page.description | default: page.excerpt | default: page.title_lead | default: site.description | strip_html | truncate: 160 }}" />
46
+ {% include base/ogp.html.liquid %}
47
+ <link rel="icon" href="{{ site.baseurl }}/assets/icons/favicon-16.png" sizes="16x16" />
48
+ <link rel="icon" href="{{ site.baseurl }}/assets/icons/favicon-32.png" sizes="32x32" />
49
+ <link rel="icon" href="{{ site.baseurl }}/assets/icons/favicon.svg" type="image/svg+xml" sizes="any" />
50
+ <link rel="apple-touch-icon" href="{{ site.baseurl }}/assets/icons/apple-touch-icon.png" sizes="180x180" />
51
+ <link rel="manifest" href="{{ site.baseurl }}/site.webmanifest" />
52
+ {%- assign head_theme_color = page.theme_color | default: site.theme_color | default: '#A54C93' %}
53
+ <meta name="theme-color" content="{{ head_theme_color }}" />
54
+ <link rel="preconnect" href="https://fonts.googleapis.com" />
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
+ {%- include base/fontawesome.html.liquid type="preload" %}
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'" />
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>
74
+ <link rel="stylesheet" href="{{ site.baseurl }}/assets/css/base/stylesheet.min.css" />
75
+ {%- comment %}
76
+ Dynamic Breaking News Offset CSS
77
+ Adjust scroll-margin-top values based on the number of breaking news items.
78
+ Uses CSS custom properties for cleaner, more maintainable dynamic styling.
79
+ {%- endcomment %}
80
+ {%- assign breakingnews = page.with_breakingnews_data | default: site.data.breakingnews | default: site.data.base.breakingnews %}
81
+ {%- if page.with_breakingnews == true and breakingnews.size > 0 %}
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 %}
84
+ {%- assign breakingnews_offset = 0 %}
85
+ {%- for item in breakingnews %}
86
+ {%- if forloop.first %}
87
+ {%- assign breakingnews_offset = breakingnews_alert_height | plus: navbar_height %}
88
+ {%- else %}
89
+ {%- assign breakingnews_offset = breakingnews_offset | plus: breakingnews_alert_height %}
90
+ {%- endif %}
91
+ {%- endfor %}
92
+ {%- assign heading_margin_px = 48 %}
93
+ {%- assign heading_scroll_margin_height = breakingnews_offset | plus: heading_margin_px %}
94
+ {%- assign accordion_scroll_margin_height = breakingnews_offset %}
95
+ <style>
96
+ :root {
97
+ --calculated-heading-offset: {{ heading_scroll_margin_height }}px;
98
+ --calculated-accordion-offset: {{ accordion_scroll_margin_height }}px;
99
+ }
100
+ main {
101
+ .content > h1,
102
+ .content > h2,
103
+ .content > h3,
104
+ .content > h4,
105
+ .content > h5,
106
+ .content > h6 {
107
+ scroll-margin-top: calc(var(--calculated-heading-offset) * 1.3) !important;
108
+ }
109
+ .content .accordion,
110
+ .content .accordion-item {
111
+ scroll-margin-top: calc(var(--calculated-accordion-offset) * 1.5) !important;
112
+ }
113
+ }
114
+ </style>
115
+ {%- endif %}
116
+
117
+ {%- comment %} CSS dependencies {%- endcomment %}
118
+ {%- include base/fontawesome.html.liquid type="head" %}
119
+ {%- include base/highlight.html.liquid type="head" %}
120
+ {%- include base/datatable.html.liquid type="head" %}
121
+
122
+ {%- comment %} JavaScript base — Bootstrap must execute before all component scripts {%- endcomment %}
123
+ <script src="{{ site.baseurl }}/assets/js/bootstrap.bundle.min.js" defer></script>
124
+ <script src="{{ site.baseurl }}/assets/js/base/init-tooltips.min.js" defer></script>
125
+
126
+ {%- comment %} JavaScript optional library extensions {%- endcomment %}
127
+ {%- include base/fontawesome.html.liquid type="script" %}
128
+ {%- include base/highlight.html.liquid type="script" %}
129
+ {%- include base/datatable.html.liquid type="script" %}
130
+
131
+ {%- comment %} JavaScript UI behavior components — depend on Bootstrap and FontAwesome SVG+JS {%- endcomment %}
132
+ {%- include base/backtotop.html.liquid %}
133
+ {%- include base/copyvalue.html.liquid %}
134
+ {%- include base/heading_anchor.html.liquid %}
135
+ </head>