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
Binary file
Binary file
@@ -0,0 +1,20 @@
1
+ // Back-to-Top Button Initialization
2
+ // Reads configuration from data attributes on this script tag
3
+ // Applied via backtotop.html.liquid template with data attributes
4
+
5
+ (function () {
6
+ const scriptTag = document.getElementById('centos-backtop')
7
+
8
+ if (!scriptTag) {
9
+ console.warn('Back-to-Top: script tag with id "centos-backtop" not found')
10
+ return
11
+ }
12
+
13
+ const config = {
14
+ diameter: parseInt(scriptTag.dataset.diameter || '56', 10),
15
+ backgroundColor: scriptTag.dataset.backgroundColor || '#A54C93',
16
+ textColor: scriptTag.dataset.textColor || '#ffffff'
17
+ }
18
+
19
+ addBackToTop(config)
20
+ })()
@@ -0,0 +1,145 @@
1
+ // Copy Value Component
2
+ // Provides copy-to-clipboard functionality with visual feedback.
3
+
4
+ (function () {
5
+ class CopyButtonHandler {
6
+ constructor (button, config = {}) {
7
+ this.button = button
8
+ this.originalTitle = button.getAttribute('data-bs-title') || button.getAttribute('aria-label') || button.getAttribute('title')
9
+ this.resetDelay = config.resetDelay || 2000
10
+ this.checkmarkPath = config.checkmarkPath || 'M434.8 70.1c14.3 10.4 17.5 30.4 7.1 44.7l-256 352c-5.5 7.6-14 12.3-23.4 13.1s-18.5-2.7-25.1-9.3l-128-128c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l101.5 101.5 234-321.7c10.4-14.3 30.4-17.5 44.7-7.1z'
11
+ this.checkmarkViewbox = config.checkmarkViewbox || '0 0 448 512'
12
+ this.successMessage = config.successMessage || 'Copied!'
13
+ this.originalIcon = this._captureIcon()
14
+ }
15
+
16
+ _captureIcon () {
17
+ const svg = this.button.querySelector('svg')
18
+ if (svg) {
19
+ const path = svg.querySelector('path')
20
+ return { mode: 'svg', viewBox: svg.getAttribute('viewBox'), pathD: path ? path.getAttribute('d') : null }
21
+ }
22
+ const iconEl = this.button.querySelector('[class*="fa-"]')
23
+ if (iconEl) {
24
+ return { mode: 'css', className: iconEl.className }
25
+ }
26
+ return null
27
+ }
28
+
29
+ handleClick (e) {
30
+ e.preventDefault()
31
+
32
+ const value = this.button.getAttribute('data-copy-value')
33
+
34
+ if (!value) {
35
+ console.warn('No copy value found in data-copy-value attribute', this.button)
36
+ return
37
+ }
38
+
39
+ navigator.clipboard.writeText(value.trim())
40
+ .then(() => this.showSuccess())
41
+ .catch((err) => {
42
+ console.error('Failed to copy value:', value, 'Error:', err)
43
+ })
44
+ }
45
+
46
+ showSuccess () {
47
+ this.changeToCheckmark()
48
+ this.updateTooltip(this.successMessage)
49
+ setTimeout(() => this.reset(), this.resetDelay)
50
+ }
51
+
52
+ changeToCheckmark () {
53
+ if (!this.originalIcon) return
54
+
55
+ if (this.originalIcon.mode === 'svg') {
56
+ const svg = this.button.querySelector('svg')
57
+ if (svg) {
58
+ svg.setAttribute('viewBox', this.checkmarkViewbox)
59
+ const path = svg.querySelector('path')
60
+ if (path) path.setAttribute('d', this.checkmarkPath)
61
+ }
62
+ } else {
63
+ // CSS/webfont mode: fa-check only exists in Solid style — force fa-solid
64
+ // regardless of the original style prefix to avoid a missing-glyph box.
65
+ const iconEl = this.button.querySelector('[class*="fa-"]')
66
+ if (iconEl) iconEl.className = 'fa-solid fa-check'
67
+ }
68
+ }
69
+
70
+ updateTooltip (message) {
71
+ if (!message || typeof message !== 'string') {
72
+ console.warn('Invalid tooltip message:', message)
73
+ return
74
+ }
75
+
76
+ this.button.setAttribute('data-bs-title', message)
77
+
78
+ try {
79
+ const tooltip = bootstrap.Tooltip.getInstance(this.button)
80
+ if (tooltip) {
81
+ tooltip._config.title = message
82
+ tooltip.update()
83
+ tooltip.show()
84
+ }
85
+ } catch (err) {
86
+ console.warn('Bootstrap Tooltip unavailable or error updating tooltip:', err)
87
+ }
88
+ }
89
+
90
+ reset () {
91
+ if (this.originalIcon) {
92
+ if (this.originalIcon.mode === 'svg') {
93
+ const svg = this.button.querySelector('svg')
94
+ if (svg) {
95
+ svg.setAttribute('viewBox', this.originalIcon.viewBox)
96
+ const path = svg.querySelector('path')
97
+ if (path && this.originalIcon.pathD) path.setAttribute('d', this.originalIcon.pathD)
98
+ }
99
+ } else {
100
+ const iconEl = this.button.querySelector('[class*="fa-"]')
101
+ if (iconEl) iconEl.className = this.originalIcon.className
102
+ }
103
+ }
104
+
105
+ this.updateTooltip(this.originalTitle)
106
+
107
+ try {
108
+ const tooltip = bootstrap.Tooltip.getInstance(this.button)
109
+ if (tooltip) tooltip.hide()
110
+ } catch (err) {
111
+ console.warn('Bootstrap Tooltip unavailable or error hiding tooltip:', err)
112
+ }
113
+ }
114
+ }
115
+
116
+ document.addEventListener('DOMContentLoaded', function () {
117
+ const scriptElement = document.getElementById('centos-copyvalue')
118
+ const config = {}
119
+
120
+ if (scriptElement) {
121
+ if (scriptElement.dataset.resetDelay) config.resetDelay = parseInt(scriptElement.dataset.resetDelay, 10)
122
+ if (scriptElement.dataset.checkmarkPath) config.checkmarkPath = scriptElement.dataset.checkmarkPath
123
+ if (scriptElement.dataset.checkmarkViewbox) config.checkmarkViewbox = scriptElement.dataset.checkmarkViewbox
124
+ if (scriptElement.dataset.successMessage) config.successMessage = scriptElement.dataset.successMessage
125
+ }
126
+
127
+ const handlers = new WeakMap()
128
+
129
+ document.addEventListener('click', function (e) {
130
+ const button = e.target.closest('.copy-btn')
131
+ if (!button) return
132
+
133
+ if (!handlers.has(button)) {
134
+ try {
135
+ handlers.set(button, new CopyButtonHandler(button, config))
136
+ } catch (err) {
137
+ console.error('Failed to initialize copy button:', button, 'Error:', err)
138
+ return
139
+ }
140
+ }
141
+
142
+ handlers.get(button).handleClick(e)
143
+ })
144
+ })
145
+ })()
@@ -0,0 +1,41 @@
1
+ // DataTables Initialization
2
+ // Reads configuration from data attributes on this script tag
3
+ // Applied via datatable.html.liquid template with data attributes
4
+
5
+ (function () {
6
+ if (typeof DataTable === 'undefined') {
7
+ console.warn('datatable: DataTable not available')
8
+ return
9
+ }
10
+
11
+ const scriptTag = document.getElementById('centos-datatable')
12
+
13
+ if (!scriptTag) {
14
+ console.warn('DataTables: script tag with id "centos-datatable" not found')
15
+ return
16
+ }
17
+
18
+ const pageLength = parseInt(scriptTag.dataset.pageLength || '10', 10)
19
+ const lengthMenuStr = scriptTag.dataset.lengthMenu || '[10,25,50,75]'
20
+
21
+ let lengthMenu = [10, 25, 50, 100]
22
+ try {
23
+ lengthMenu = JSON.parse(lengthMenuStr)
24
+ } catch (e) {
25
+ console.warn('DataTables: Invalid lengthMenu format, using default:', e)
26
+ }
27
+
28
+ document.querySelectorAll('table.dataTable').forEach(function (tableEl) {
29
+ const rowCount = tableEl.querySelectorAll('tbody tr').length
30
+ const enabledCondition = rowCount > 10
31
+
32
+ new DataTable(tableEl, {
33
+ paging: enabledCondition,
34
+ info: enabledCondition,
35
+ searching: enabledCondition,
36
+ order: [[0, 'asc']],
37
+ pageLength: pageLength,
38
+ lengthMenu: lengthMenu
39
+ })
40
+ })
41
+ })()
@@ -0,0 +1,108 @@
1
+ // Heading Anchor Component — requires Bootstrap >= 5.3 (tooltip.setContent) and Font Awesome 6+
2
+
3
+ document.addEventListener('DOMContentLoaded', () => {
4
+ if (typeof bootstrap === 'undefined') {
5
+ console.warn('heading-anchor: Bootstrap not available')
6
+ return
7
+ }
8
+
9
+ const DEFAULT_TEXT = 'Copy link'
10
+ const scriptEl = document.getElementById('centos-heading-anchor')
11
+ const RESET_DELAY = scriptEl?.dataset.resetDelay
12
+ ? parseInt(scriptEl.dataset.resetDelay, 10) : 2000
13
+ const SUCCESS_TEXT = scriptEl?.dataset.successMessage || 'Copied!'
14
+
15
+ // One shared region: multiple regions would cause simultaneous AT announcements per anchor.
16
+ let liveRegion = document.getElementById('centos-heading-anchor-live')
17
+ if (!liveRegion) {
18
+ liveRegion = document.createElement('div')
19
+ liveRegion.id = 'centos-heading-anchor-live'
20
+ liveRegion.setAttribute('aria-live', 'polite')
21
+ liveRegion.setAttribute('aria-atomic', 'true')
22
+ liveRegion.className = 'visually-hidden'
23
+ document.body.appendChild(liveRegion)
24
+ }
25
+
26
+ document.querySelectorAll('.heading-anchor[data-copy-anchor]').forEach(anchor => {
27
+ // FA SVG+JS replaces <i> with <svg> before this DOMContentLoaded fires.
28
+ // Cache innerHTML after FA has processed so it can be restored on reset.
29
+ const originalIconHTML = anchor.innerHTML
30
+ // Guards blur/mouseenter handlers from collapsing the tooltip during the success window.
31
+ let isLocked = false
32
+
33
+ const tooltip = new bootstrap.Tooltip(anchor, {
34
+ title: DEFAULT_TEXT,
35
+ trigger: 'manual', // CSS sets pointer-events:none on hidden anchors, defeating Bootstrap's auto hover/focus triggers.
36
+ placement: 'top',
37
+ animation: false // Prevents Bootstrap's fade and the CSS opacity transition from desyncing.
38
+ })
39
+
40
+ const updateUI = (isSuccess) => {
41
+ tooltip.setContent({ '.tooltip-inner': isSuccess ? SUCCESS_TEXT : DEFAULT_TEXT })
42
+ if (isSuccess) {
43
+ // FA SVG+JS mode: <i> has been replaced by <svg>; swap the path to a checkmark.
44
+ const svg = anchor.querySelector('svg')
45
+ if (svg) {
46
+ const path = svg.querySelector('path')
47
+ if (path) {
48
+ svg.setAttribute('viewBox', '0 0 448 512')
49
+ path.setAttribute('d', 'M434.8 70.1c14.3 10.4 17.5 30.4 7.1 44.7l-256 352c-5.5 7.6-14 12.3-23.4 13.1s-18.5-2.7-25.1-9.3l-128-128c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l101.5 101.5 234-321.7c10.4-14.3 30.4-17.5 44.7-7.1z')
50
+ }
51
+ } else {
52
+ // FA webfont mode: <i> is still in the DOM; toggle classes normally.
53
+ const icon = anchor.querySelector('i')
54
+ if (icon) { icon.classList.remove('fa-hashtag'); icon.classList.add('fa-check') }
55
+ }
56
+ } else {
57
+ anchor.innerHTML = originalIconHTML
58
+ }
59
+ anchor.classList.toggle('is-active', isSuccess)
60
+ // Empty string on reset prevents AT from re-announcing stale text on DOM inspection.
61
+ liveRegion.textContent = isSuccess ? SUCCESS_TEXT : ''
62
+ if (isSuccess) tooltip.show()
63
+ }
64
+
65
+ const handleInteraction = (show) => {
66
+ if (!isLocked) show ? tooltip.show() : tooltip.hide()
67
+ }
68
+
69
+ anchor.addEventListener('mouseenter', () => handleInteraction(true))
70
+ anchor.addEventListener('mouseleave', () => handleInteraction(false))
71
+ anchor.addEventListener('focus', () => handleInteraction(true))
72
+ anchor.addEventListener('blur', () => handleInteraction(false))
73
+
74
+ anchor.addEventListener('click', async (e) => {
75
+ e.preventDefault()
76
+ if (isLocked) return
77
+
78
+ if (!navigator.clipboard) {
79
+ console.warn('heading-anchor: Clipboard API unavailable')
80
+ return
81
+ }
82
+
83
+ const url = window.location.origin + window.location.pathname + anchor.dataset.copyAnchor
84
+
85
+ try {
86
+ await navigator.clipboard.writeText(url)
87
+ isLocked = true
88
+ // isLocked must be true before blur() so the resulting blur event is suppressed
89
+ // and does not hide the tooltip before the success state has been rendered.
90
+ anchor.blur()
91
+ updateUI(true)
92
+
93
+ setTimeout(() => {
94
+ isLocked = false
95
+ updateUI(false)
96
+ // mouseleave/blur events fired while isLocked was true were suppressed;
97
+ // hide now if the user already moved away during the success window.
98
+ if (!anchor.matches(':hover')) tooltip.hide()
99
+ }, RESET_DELAY)
100
+
101
+ } catch (err) {
102
+ console.warn('heading-anchor: clipboard write failed', err)
103
+ isLocked = false
104
+ anchor.innerHTML = originalIconHTML
105
+ }
106
+ })
107
+ })
108
+ })
@@ -0,0 +1,12 @@
1
+ // Highlight.js Initialization
2
+ // Initializes syntax highlighting on all code blocks with 'hljs' class
3
+ // Enables copy-to-clipboard functionality via highlightjs-copy plugin
4
+ (function () {
5
+ if (typeof hljs === 'undefined' || typeof CopyButtonPlugin === 'undefined') {
6
+ console.warn('highlight: hljs or CopyButtonPlugin not available')
7
+ return
8
+ }
9
+ document.querySelectorAll('.content code').forEach(el => el.classList.add('hljs'))
10
+ hljs.addPlugin(new CopyButtonPlugin())
11
+ hljs.highlightAll()
12
+ })()
@@ -0,0 +1,12 @@
1
+ // Bootstrap Tooltip and Popover Initialization
2
+ (function () {
3
+ if (typeof bootstrap === 'undefined') {
4
+ console.warn('init-tooltips: Bootstrap not available')
5
+ return
6
+ }
7
+ const tooltipTriggerList = document.querySelectorAll('[data-bs-toggle="tooltip"]')
8
+ ;[...tooltipTriggerList].forEach((el) => new bootstrap.Tooltip(el))
9
+
10
+ const popoverTriggerList = document.querySelectorAll('[data-bs-toggle="popover"]')
11
+ ;[...popoverTriggerList].forEach((el) => new bootstrap.Popover(el))
12
+ })()