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.
- checksums.yaml +7 -0
- data/_config.yml +196 -0
- data/_data/base/announcement_schema.yml +49 -0
- data/_data/base/artwork_schema.yml +46 -0
- data/_data/base/backtotop_schema.yml +59 -0
- data/_data/base/bits.yml +96 -0
- data/_data/base/bits_schema.yml +185 -0
- data/_data/base/breadcrumb_schema.yml +27 -0
- data/_data/base/breakingnews_schema.yml +67 -0
- data/_data/base/card_schema.yml +146 -0
- data/_data/base/color.yml +1042 -0
- data/_data/base/color_schema.yml +1036 -0
- data/_data/base/configuration_variables_schema.yml +42 -0
- data/_data/base/content.yml +2 -0
- data/_data/base/content_schema.yml +26 -0
- data/_data/base/copyright.yml +12 -0
- data/_data/base/copyright_schema.yml +74 -0
- data/_data/base/copyvalue_schema.yml +49 -0
- data/_data/base/datatable_schema.yml +57 -0
- data/_data/base/event_schema.yml +130 -0
- data/_data/base/fontawesome_schema.yml +62 -0
- data/_data/base/footer.yml +9 -0
- data/_data/base/footer_schema.yml +55 -0
- data/_data/base/head_schema.yml +19 -0
- data/_data/base/heading_anchor.yml +2 -0
- data/_data/base/heading_anchor_schema.yml +37 -0
- data/_data/base/highlight_schema.yml +98 -0
- data/_data/base/image_schema.yml +34 -0
- data/_data/base/languages.yml +186 -0
- data/_data/base/link_schema.yml +187 -0
- data/_data/base/locales_schema.yml +158 -0
- data/_data/base/navbar.yml +20 -0
- data/_data/base/navbar_schema.yml +129 -0
- data/_data/base/navindex_schema.yml +67 -0
- data/_data/base/ogp.yml +24 -0
- data/_data/base/ogp_schema.yml +192 -0
- data/_data/base/project.yml +37 -0
- data/_data/base/project_schema.yml +124 -0
- data/_data/base/script_schema.yml +41 -0
- data/_data/base/shortcut_schema.yml +74 -0
- data/_data/base/social.yml +26 -0
- data/_data/base/social_schema.yml +57 -0
- data/_data/base/sponsors.yml +41 -0
- data/_data/base/sponsors_schema.yml +73 -0
- data/_data/base/title_schema.yml +49 -0
- data/_data/base/toc_schema.yml +114 -0
- data/_data/download/cards.yml +309 -0
- data/_data/download/navbar.yml +11 -0
- data/_includes/base/announcement.html.liquid +65 -0
- data/_includes/base/artwork.html.liquid +63 -0
- data/_includes/base/backtotop.html.liquid +73 -0
- data/_includes/base/bits.html.liquid +152 -0
- data/_includes/base/breadcrumb.html.liquid +77 -0
- data/_includes/base/breakingnews.html.liquid +90 -0
- data/_includes/base/card.html.liquid +110 -0
- data/_includes/base/color-table.html.liquid +33 -0
- data/_includes/base/configuration_variables-nested.html.liquid +98 -0
- data/_includes/base/configuration_variables.html.liquid +98 -0
- data/_includes/base/content.html.liquid +7 -0
- data/_includes/base/copyright.html.liquid +70 -0
- data/_includes/base/copyvalue.html.liquid +82 -0
- data/_includes/base/datatable.html.liquid +83 -0
- data/_includes/base/event.html.liquid +105 -0
- data/_includes/base/fontawesome.html.liquid +91 -0
- data/_includes/base/footer.html.liquid +69 -0
- data/_includes/base/head.html.liquid +135 -0
- data/_includes/base/heading_anchor.html.liquid +67 -0
- data/_includes/base/highlight.html.liquid +84 -0
- data/_includes/base/image.html.liquid +42 -0
- data/_includes/base/link.html.liquid +129 -0
- data/_includes/base/locales.html.liquid +78 -0
- data/_includes/base/navbar.html.liquid +121 -0
- data/_includes/base/navindex.html.liquid +200 -0
- data/_includes/base/ogp.html.liquid +144 -0
- data/_includes/base/project.html.liquid +104 -0
- data/_includes/base/shortcut.html.liquid +77 -0
- data/_includes/base/social.html.liquid +76 -0
- data/_includes/base/sponsors-cards.html.liquid +69 -0
- data/_includes/base/sponsors-carousel.html.liquid +91 -0
- data/_includes/base/title.html.liquid +65 -0
- data/_includes/base/toc-generator.html.liquid +189 -0
- data/_includes/base/toc.html.liquid +95 -0
- data/_includes/download/cards-body-commands.html +7 -0
- data/_includes/download/cards-body-convert.html +10 -0
- data/_includes/download/cards-body-doc.html +9 -0
- data/_includes/download/cards-body-documentation.html +11 -0
- data/_includes/download/cards-body-eol.html +16 -0
- data/_includes/download/cards-body-mirrors.html +8 -0
- data/_includes/download/cards-body-screenshot.html +26 -0
- data/_includes/download/cards-body-screenshots.html +32 -0
- data/_includes/download/cards-body.html +8 -0
- data/_includes/download/cards-footer.html +3 -0
- data/_includes/download/cards-header-commands.html +8 -0
- data/_includes/download/cards-header-convert.html +8 -0
- data/_includes/download/cards-header-doc.html +8 -0
- data/_includes/download/cards-header-documentation.html +8 -0
- data/_includes/download/cards-header-eol.html +8 -0
- data/_includes/download/cards-header-mirrors.html +13 -0
- data/_includes/download/cards-header-screenshot.html +8 -0
- data/_includes/download/cards-header-screenshots.html +8 -0
- data/_includes/download/cards-header.html +13 -0
- data/_includes/download/cards.html +120 -0
- data/_layouts/base/default.html +68 -0
- data/_layouts/download/cards.html +7 -0
- data/_layouts/download/default.html +7 -0
- data/_layouts/people/default.html +68 -0
- data/_sass/base/_customization.scss +331 -0
- data/_sass/base/_light-dark.scss +10 -0
- data/_sass/base/_maps.scss +104 -0
- data/_sass/base/_variables.scss +232 -0
- data/_sass/bootstrap/_accordion.scss +153 -0
- data/_sass/bootstrap/_alert.scss +68 -0
- data/_sass/bootstrap/_badge.scss +38 -0
- data/_sass/bootstrap/_breadcrumb.scss +40 -0
- data/_sass/bootstrap/_button-group.scss +147 -0
- data/_sass/bootstrap/_buttons.scss +216 -0
- data/_sass/bootstrap/_card.scss +238 -0
- data/_sass/bootstrap/_carousel.scss +226 -0
- data/_sass/bootstrap/_close.scss +66 -0
- data/_sass/bootstrap/_containers.scss +41 -0
- data/_sass/bootstrap/_dropdown.scss +250 -0
- data/_sass/bootstrap/_forms.scss +9 -0
- data/_sass/bootstrap/_functions.scss +302 -0
- data/_sass/bootstrap/_grid.scss +39 -0
- data/_sass/bootstrap/_helpers.scss +12 -0
- data/_sass/bootstrap/_images.scss +42 -0
- data/_sass/bootstrap/_list-group.scss +199 -0
- data/_sass/bootstrap/_maps.scss +174 -0
- data/_sass/bootstrap/_mixins.scss +42 -0
- data/_sass/bootstrap/_modal.scss +240 -0
- data/_sass/bootstrap/_nav.scss +197 -0
- data/_sass/bootstrap/_navbar.scss +289 -0
- data/_sass/bootstrap/_offcanvas.scss +147 -0
- data/_sass/bootstrap/_pagination.scss +109 -0
- data/_sass/bootstrap/_placeholders.scss +51 -0
- data/_sass/bootstrap/_popover.scss +196 -0
- data/_sass/bootstrap/_progress.scss +68 -0
- data/_sass/bootstrap/_reboot.scss +617 -0
- data/_sass/bootstrap/_root.scss +187 -0
- data/_sass/bootstrap/_spinners.scss +86 -0
- data/_sass/bootstrap/_tables.scss +171 -0
- data/_sass/bootstrap/_toasts.scss +73 -0
- data/_sass/bootstrap/_tooltip.scss +119 -0
- data/_sass/bootstrap/_transitions.scss +27 -0
- data/_sass/bootstrap/_type.scss +106 -0
- data/_sass/bootstrap/_utilities.scss +806 -0
- data/_sass/bootstrap/_variables-dark.scss +102 -0
- data/_sass/bootstrap/_variables.scss +1753 -0
- data/_sass/bootstrap/bootstrap-grid.scss +62 -0
- data/_sass/bootstrap/bootstrap-reboot.scss +10 -0
- data/_sass/bootstrap/bootstrap-utilities.scss +19 -0
- data/_sass/bootstrap/bootstrap.scss +52 -0
- data/_sass/bootstrap/forms/_floating-labels.scss +97 -0
- data/_sass/bootstrap/forms/_form-check.scss +189 -0
- data/_sass/bootstrap/forms/_form-control.scss +214 -0
- data/_sass/bootstrap/forms/_form-range.scss +91 -0
- data/_sass/bootstrap/forms/_form-select.scss +80 -0
- data/_sass/bootstrap/forms/_form-text.scss +11 -0
- data/_sass/bootstrap/forms/_input-group.scss +132 -0
- data/_sass/bootstrap/forms/_labels.scss +36 -0
- data/_sass/bootstrap/forms/_validation.scss +12 -0
- data/_sass/bootstrap/helpers/_clearfix.scss +3 -0
- data/_sass/bootstrap/helpers/_color-bg.scss +7 -0
- data/_sass/bootstrap/helpers/_colored-links.scss +30 -0
- data/_sass/bootstrap/helpers/_focus-ring.scss +5 -0
- data/_sass/bootstrap/helpers/_icon-link.scss +25 -0
- data/_sass/bootstrap/helpers/_position.scss +36 -0
- data/_sass/bootstrap/helpers/_ratio.scss +26 -0
- data/_sass/bootstrap/helpers/_stacks.scss +15 -0
- data/_sass/bootstrap/helpers/_stretched-link.scss +15 -0
- data/_sass/bootstrap/helpers/_text-truncation.scss +7 -0
- data/_sass/bootstrap/helpers/_visually-hidden.scss +8 -0
- data/_sass/bootstrap/helpers/_vr.scss +8 -0
- data/_sass/bootstrap/mixins/_alert.scss +18 -0
- data/_sass/bootstrap/mixins/_backdrop.scss +14 -0
- data/_sass/bootstrap/mixins/_banner.scss +7 -0
- data/_sass/bootstrap/mixins/_border-radius.scss +78 -0
- data/_sass/bootstrap/mixins/_box-shadow.scss +24 -0
- data/_sass/bootstrap/mixins/_breakpoints.scss +127 -0
- data/_sass/bootstrap/mixins/_buttons.scss +70 -0
- data/_sass/bootstrap/mixins/_caret.scss +69 -0
- data/_sass/bootstrap/mixins/_clearfix.scss +9 -0
- data/_sass/bootstrap/mixins/_color-mode.scss +21 -0
- data/_sass/bootstrap/mixins/_color-scheme.scss +7 -0
- data/_sass/bootstrap/mixins/_container.scss +11 -0
- data/_sass/bootstrap/mixins/_deprecate.scss +10 -0
- data/_sass/bootstrap/mixins/_forms.scss +163 -0
- data/_sass/bootstrap/mixins/_gradients.scss +47 -0
- data/_sass/bootstrap/mixins/_grid.scss +151 -0
- data/_sass/bootstrap/mixins/_image.scss +16 -0
- data/_sass/bootstrap/mixins/_list-group.scss +26 -0
- data/_sass/bootstrap/mixins/_lists.scss +7 -0
- data/_sass/bootstrap/mixins/_pagination.scss +10 -0
- data/_sass/bootstrap/mixins/_reset-text.scss +17 -0
- data/_sass/bootstrap/mixins/_resize.scss +6 -0
- data/_sass/bootstrap/mixins/_table-variants.scss +24 -0
- data/_sass/bootstrap/mixins/_text-truncate.scss +8 -0
- data/_sass/bootstrap/mixins/_transition.scss +26 -0
- data/_sass/bootstrap/mixins/_utilities.scss +97 -0
- data/_sass/bootstrap/mixins/_visually-hidden.scss +38 -0
- data/_sass/bootstrap/utilities/_api.scss +47 -0
- data/_sass/bootstrap/vendor/_rfs.scss +348 -0
- data/assets/css/base/stylesheet.min.scss +35 -0
- data/assets/icons/android-chrome-192.png +0 -0
- data/assets/icons/android-chrome-512.png +0 -0
- data/assets/icons/apple-touch-icon.png +0 -0
- data/assets/icons/favicon-16.png +0 -0
- data/assets/icons/favicon-32.png +0 -0
- data/assets/icons/favicon.ico +0 -0
- data/assets/icons/favicon.svg +1 -0
- data/assets/img/anaconda-symbolic.svg +1 -0
- data/assets/img/anaconda.svg +1 -0
- data/assets/img/base/centos-colors.gpl +55 -0
- data/assets/img/base/example-ogp-image.svg +297 -0
- data/assets/img/base/example-sponsors-design.svg +226 -0
- data/assets/img/base/example-sponsors-logo-1.svg +120 -0
- data/assets/img/base/example-sponsors-logo-2.svg +116 -0
- data/assets/img/base/example-sponsors-logo-3.svg +123 -0
- data/assets/img/base/example-sponsors-logo-4.svg +116 -0
- data/assets/img/base/example-sponsors-logo-5.svg +116 -0
- data/assets/img/base/example-sponsors-logo-6.svg +116 -0
- data/assets/img/base/example-sponsors-logo-7.svg +116 -0
- data/assets/img/base/example-sponsors-logo-8.svg +110 -0
- data/assets/img/base/page-layout-default.svg +1217 -0
- data/assets/img/base/page-with-alert.svg +383 -0
- data/assets/img/base/page-with-announcement.svg +956 -0
- data/assets/img/base/page-with-artwork.svg +1009 -0
- data/assets/img/base/page-with-backtotop.svg +1009 -0
- data/assets/img/base/page-with-bits.svg +891 -0
- data/assets/img/base/page-with-breadcrumb.svg +676 -0
- data/assets/img/base/page-with-breakingnews.svg +957 -0
- data/assets/img/base/page-with-color.svg +57 -0
- data/assets/img/base/page-with-copyright.svg +1018 -0
- data/assets/img/base/page-with-copyvalue.svg +57 -0
- data/assets/img/base/page-with-datatable.svg +857 -0
- data/assets/img/base/page-with-event.svg +518 -0
- data/assets/img/base/page-with-fontawesome.svg +147 -0
- data/assets/img/base/page-with-footer.svg +1018 -0
- data/assets/img/base/page-with-heading.svg +57 -0
- data/assets/img/base/page-with-highlight.svg +86 -0
- data/assets/img/base/page-with-image.svg +57 -0
- data/assets/img/base/page-with-link.svg +57 -0
- data/assets/img/base/page-with-locales.svg +1009 -0
- data/assets/img/base/page-with-navbar.svg +958 -0
- data/assets/img/base/page-with-navindex.svg +279 -0
- data/assets/img/base/page-with-ogp.svg +401 -0
- data/assets/img/base/page-with-project.svg +423 -0
- data/assets/img/base/page-with-shortcut.svg +937 -0
- data/assets/img/base/page-with-social.svg +937 -0
- data/assets/img/base/page-with-sponsors.svg +937 -0
- data/assets/img/base/page-with-title.svg +584 -0
- data/assets/img/base/page-with-toc.svg +399 -0
- data/assets/img/base/screenshot-1200x600.svg +114 -0
- data/assets/img/centos-dynamicmsg-logo.svg +1 -0
- data/assets/img/centos-dynamicmsg-type.svg +1 -0
- data/assets/img/centos-dynamicmsg-whitelogo.svg +1 -0
- data/assets/img/centos-dynamicmsg-whitetype.svg +1 -0
- data/assets/img/centos-gdm-whitelogo.svg +1 -0
- data/assets/img/centos-ipa-whiteheader.svg +1 -0
- data/assets/img/centos-logo-2bits.svg +1 -0
- data/assets/img/centos-logo.svg +1 -0
- data/assets/img/centos-message-logo.svg +1 -0
- data/assets/img/centos-motif.png +0 -0
- data/assets/img/centos-poweredby-logo.svg +1 -0
- data/assets/img/centos-social-share.png +0 -0
- data/assets/img/centos-symbol-2bits.svg +1 -0
- data/assets/img/centos-symbol.svg +1 -0
- data/assets/img/centos-type.svg +1 -0
- data/assets/img/centos-vertical-logo.svg +1 -0
- data/assets/img/centos-vertical-message-logo.svg +1 -0
- data/assets/img/centos-whitelogo.svg +1 -0
- data/assets/img/download/centos-linux-7-2009-screenshot-n.png +0 -0
- data/assets/img/download/centos-stream-8-screenshot-n.png +0 -0
- data/assets/img/download/centos-stream-9-screenshot-n.png +0 -0
- data/assets/img/download/distribution-release-screenshot-1.png +0 -0
- data/assets/img/download/distribution-release-screenshot-2.png +0 -0
- data/assets/img/download/distribution-release-screenshot-3.png +0 -0
- data/assets/img/download/distribution-release-screenshot-n.png +0 -0
- data/assets/img/download/distribution-release-screenshot-n.svg +134 -0
- data/assets/img/download/download.svg +421 -0
- data/assets/img/download/fig-the-downloads-cards-presentation-template.png +0 -0
- data/assets/img/people/page.svg +900 -0
- data/assets/img/people/page.webp +0 -0
- data/assets/img/people/username.webp +0 -0
- data/assets/js/base/backtotop.js +20 -0
- data/assets/js/base/copyvalue.js +145 -0
- data/assets/js/base/datatable.js +41 -0
- data/assets/js/base/heading-anchor.js +108 -0
- data/assets/js/base/highlight.js +12 -0
- data/assets/js/base/init-tooltips.js +12 -0
- data/assets/js/bootstrap.bundle.js +6312 -0
- data/assets/js/bootstrap.bundle.js.map +1 -0
- data/assets/js/bootstrap.bundle.min.js +7 -0
- data/assets/js/bootstrap.bundle.min.js.map +1 -0
- data/assets/js/bootstrap.esm.js +4447 -0
- data/assets/js/bootstrap.esm.js.map +1 -0
- data/assets/js/bootstrap.esm.min.js +7 -0
- data/assets/js/bootstrap.esm.min.js.map +1 -0
- data/assets/js/bootstrap.js +4494 -0
- data/assets/js/bootstrap.js.map +1 -0
- data/assets/js/bootstrap.min.js +7 -0
- data/assets/js/bootstrap.min.js.map +1 -0
- data/site.webmanifest +11 -0
- 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
|
+
})()
|