jekyll-theme-centos 2.52.0.beta.84 → 2.52.0.beta.86

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 (44) hide show
  1. checksums.yaml +4 -4
  2. data/_config.yml +1 -8
  3. data/_data/base/calendar_schema.yml +156 -0
  4. data/_data/base/card_schema.yml +10 -2
  5. data/_data/base/event_schema.yml +19 -58
  6. data/_data/base/project_schema.yml +6 -1
  7. data/_includes/base/bits.html.liquid +3 -3
  8. data/_includes/base/calendar-events.html.liquid +49 -0
  9. data/_includes/base/calendar-init.html.liquid +148 -0
  10. data/_includes/base/calendar.html.liquid +70 -0
  11. data/_includes/base/card.html.liquid +2 -2
  12. data/_includes/base/color-table.html.liquid +1 -1
  13. data/_includes/base/configuration_variables-nested.html.liquid +1 -1
  14. data/_includes/base/configuration_variables.html.liquid +1 -1
  15. data/_includes/base/event.html.liquid +57 -2
  16. data/_includes/base/head.html.liquid +8 -1
  17. data/_includes/base/link.html.liquid +8 -0
  18. data/_includes/base/navindex.html.liquid +2 -2
  19. data/_sass/base/_calendar.scss +185 -0
  20. data/_sass/base/_customization.scss +19 -32
  21. data/_sass/base/_datatable.scss +125 -0
  22. data/assets/css/base/stylesheet.min.scss +5 -0
  23. data/assets/img/base/page-layout-default.svg +113 -134
  24. data/assets/img/base/page-with-alert.svg +348 -957
  25. data/assets/img/base/page-with-announcement.svg +363 -969
  26. data/assets/img/base/page-with-artwork.svg +327 -997
  27. data/assets/img/base/page-with-backtotop.svg +373 -918
  28. data/assets/img/base/page-with-bits.svg +278 -958
  29. data/assets/img/base/page-with-breadcrumb.svg +265 -958
  30. data/assets/img/base/page-with-breakingnews.svg +352 -969
  31. data/assets/img/base/page-with-calendar.svg +57 -0
  32. data/assets/img/base/page-with-copyright.svg +375 -916
  33. data/assets/img/base/page-with-datatable.svg +24 -824
  34. data/assets/img/base/page-with-event.svg +393 -463
  35. data/assets/img/base/page-with-footer.svg +375 -916
  36. data/assets/img/base/page-with-locales.svg +372 -917
  37. data/assets/img/base/page-with-project.svg +397 -599
  38. data/assets/img/base/page-with-shortcut.svg +373 -918
  39. data/assets/img/base/page-with-social.svg +373 -918
  40. data/assets/img/base/page-with-sponsors.svg +373 -918
  41. data/assets/img/base/page-with-title.svg +285 -545
  42. data/assets/img/base/page-with-toc.svg +268 -998
  43. data/assets/js/base/datatable.js +16 -1
  44. metadata +8 -1
@@ -27,7 +27,7 @@ of separate, nested DataTables for complex properties.
27
27
 
28
28
  {% comment %} 3. Render the top-level table completely {% endcomment %}
29
29
  <table class="{{ table_classes }}">
30
- <thead class="table-light">
30
+ <thead>
31
31
  <tr>
32
32
  <th scope="col">{{ col_name }}</th>
33
33
  {% if columns %}
@@ -16,10 +16,12 @@ Design Logic:
16
16
 
17
17
  Required Inputs:
18
18
  - title: Event name/title
19
+ - start: Event start (YYYY-MM-DD for an all-day event, or YYYY-MM-DDTHH:MM
20
+ to give it a specific start time on that same day)
19
21
 
20
22
  Optional Inputs:
21
23
  - description: Event description text
22
- - date: Event date/time string
24
+ - end: Event inclusive end (same format as start), defaults to start
23
25
  - location: Event location name
24
26
  - color: Alert color scheme (default: "secondary")
25
27
  - icon: Icon class (default: "fa-solid fa-calendar")
@@ -57,8 +59,61 @@ Data Source Hierarchy (priority):
57
59
  {%- assign event_city = event.city | default: with_event_schema.city.default %}
58
60
  {%- assign event_color = event.color | default: with_event_schema.color.default %}
59
61
  {%- assign event_location = event.location | default: with_event_schema.location.default %}
60
- {%- assign event_date = event.date | default: with_event_schema.date.default %}
61
62
  {%- assign event_description = event.description | default: with_event_schema.description.default %}
63
+
64
+ {%- comment %}
65
+ Derive the same style of display string the old free-text `date` field
66
+ used to hold (e.g. "September 19 - 20, 2025") from the structured,
67
+ inclusive `start`/`end` ISO dates — collapsing the month/year whenever
68
+ both sides share it, spelling both out in full otherwise. No date
69
+ arithmetic here, only formatting and string comparison of the formatted
70
+ output; the calendar component (reading this same with_event_data) is
71
+ the one place that does inclusive-to-exclusive end-date arithmetic, in
72
+ JS. See the calendar component's event data contract documentation.
73
+
74
+ A `start` carrying a time-of-day (`YYYY-MM-DDTHH:MM`) is a same-day timed
75
+ event rather than a date range — it gets its own branch below that
76
+ appends the clock time(s) instead of running the range-collapsing logic.
77
+ {% endcomment %}
78
+ {%- assign event_start = event.start %}
79
+ {%- if event_start != "" and event_start != nil %}
80
+ {%- assign event_end = event.end | default: event_start %}
81
+ {%- if event_end == "" %}
82
+ {%- assign event_end = event_start %}
83
+ {%- endif %}
84
+ {%- if event_start contains "T" %}
85
+ {%- assign event_date = event_start | date: "%B %-d, %Y" %}
86
+ {%- assign event_start_time = event_start | date: "%-l:%M %p" %}
87
+ {%- if event_end != event_start %}
88
+ {%- assign event_end_time = event_end | date: "%-l:%M %p" %}
89
+ {%- assign event_date = event_date | append: ", " | append: event_start_time | append: " - " | append: event_end_time %}
90
+ {%- else %}
91
+ {%- assign event_date = event_date | append: ", " | append: event_start_time %}
92
+ {%- endif %}
93
+ {%- else %}
94
+ {%- assign event_start_ym = event_start | date: "%Y-%m" %}
95
+ {%- assign event_end_ym = event_end | date: "%Y-%m" %}
96
+ {%- assign event_start_y = event_start | date: "%Y" %}
97
+ {%- assign event_end_y = event_end | date: "%Y" %}
98
+ {%- if event_start == event_end %}
99
+ {%- assign event_date = event_start | date: "%B %-d, %Y" %}
100
+ {%- elsif event_start_ym == event_end_ym %}
101
+ {%- assign event_date_start = event_start | date: "%B %-d" %}
102
+ {%- assign event_date_end = event_end | date: "%-d, %Y" %}
103
+ {%- assign event_date = event_date_start | append: " - " | append: event_date_end %}
104
+ {%- elsif event_start_y == event_end_y %}
105
+ {%- assign event_date_start = event_start | date: "%B %-d" %}
106
+ {%- assign event_date_end = event_end | date: "%B %-d, %Y" %}
107
+ {%- assign event_date = event_date_start | append: " - " | append: event_date_end %}
108
+ {%- else %}
109
+ {%- assign event_date_start = event_start | date: "%B %-d, %Y" %}
110
+ {%- assign event_date_end = event_end | date: "%B %-d, %Y" %}
111
+ {%- assign event_date = event_date_start | append: " - " | append: event_date_end %}
112
+ {%- endif %}
113
+ {%- endif %}
114
+ {%- else %}
115
+ {%- assign event_date = "" %}
116
+ {%- endif %}
62
117
  {%- assign event_icon = event.icon | default: with_event_schema.icon.default %}
63
118
  {%- assign event_image_url = event.image_url | default: with_event_schema.image_url.default %}
64
119
  {%- assign event_link = event.link | default: with_event_schema.link.default %}
@@ -11,7 +11,7 @@ Design Logic:
11
11
  - Favicon support: multiple formats (16x16, 32x32, SVG with type, Apple Touch)
12
12
  - Google Fonts: Montserrat (5 weights) and Source Code Pro (2 weights) via async stylesheet
13
13
  - Breakingnews scroll offset: dynamic CSS calculation
14
- - Conditional includes: OGP, Highlight.js, DataTables, FontAwesome (SVG+JS)
14
+ - Conditional includes: OGP, Highlight.js, DataTables, FontAwesome (SVG+JS), Event Calendar
15
15
  - CSS prioritization: custom stylesheet last for override
16
16
  - Script loading: Bootstrap base first (defer), then optional extensions, then UI behaviors
17
17
  - Bootstrap and FontAwesome preloaded (high-priority fetch); CDN origins preconnected + dns-prefetched per active component
@@ -25,6 +25,7 @@ Optional Inputs:
25
25
  - page.with_ogp, page.with_fontawesome: Include OGP/Font Awesome SVG+JS (boolean)
26
26
  - page.with_breakingnews, page.with_highlight: Include breaking news/highlight
27
27
  - page.with_datatable: Include DataTables (boolean)
28
+ - page.with_calendar: Include Event Calendar (boolean)
28
29
  - page.with_breakingnews_data: Array of breaking news items
29
30
  - page.with_backtotop: Include back-to-top button (boolean)
30
31
  - page.with_copyvalue: Include copy-to-clipboard behavior (boolean)
@@ -67,6 +68,10 @@ Optional Inputs:
67
68
  <link rel="preconnect" href="https://cdn.datatables.net" crossorigin />
68
69
  <link rel="dns-prefetch" href="https://cdn.datatables.net" />
69
70
  {%- endif %}
71
+ {%- if page.with_calendar %}
72
+ <link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin />
73
+ <link rel="dns-prefetch" href="https://cdn.jsdelivr.net" />
74
+ {%- endif %}
70
75
  <link rel="preload" href="{{ site.baseurl }}/assets/js/bootstrap.bundle.min.js" as="script" fetchpriority="high" />
71
76
  {%- include base/fontawesome.html.liquid type="preload" %}
72
77
  <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'" />
@@ -121,6 +126,7 @@ Uses CSS custom properties for cleaner, more maintainable dynamic styling.
121
126
  {%- include base/fontawesome.html.liquid type="head" %}
122
127
  {%- include base/highlight.html.liquid type="head" %}
123
128
  {%- include base/datatable.html.liquid type="head" %}
129
+ {%- include base/calendar.html.liquid type="head" %}
124
130
 
125
131
  {%- comment %} JavaScript base — Bootstrap must execute before all component scripts {%- endcomment %}
126
132
  <script src="{{ site.baseurl }}/assets/js/bootstrap.bundle.min.js" defer></script>
@@ -130,6 +136,7 @@ Uses CSS custom properties for cleaner, more maintainable dynamic styling.
130
136
  {%- include base/fontawesome.html.liquid type="script" %}
131
137
  {%- include base/highlight.html.liquid type="script" %}
132
138
  {%- include base/datatable.html.liquid type="script" %}
139
+ {%- include base/calendar.html.liquid type="script" %}
133
140
 
134
141
  {%- comment %} JavaScript UI behavior components — depend on Bootstrap and FontAwesome SVG+JS {%- endcomment %}
135
142
  {%- include base/backtotop.html.liquid %}
@@ -64,6 +64,14 @@ Security & External Links:
64
64
  {%- assign anchor = nil %}
65
65
  {%- assign rel_attr = nil %}
66
66
 
67
+ {%- comment %} --- Security: neutralize dangerous URI schemes --- {% endcomment %}
68
+ {%- if link != nil -%}
69
+ {%- assign link_downcase = link | downcase -%}
70
+ {%- if link_downcase contains "javascript:" or link_downcase contains "data:" or link_downcase contains "vbscript:" -%}
71
+ {%- assign link = "#" -%}
72
+ {%- endif -%}
73
+ {%- endif -%}
74
+
67
75
  {%- comment %} === Data processing === {% endcomment %}
68
76
  {%- if link != nil -%}
69
77
  {%- assign link_char1 = link | slice: 0, 1 -%}
@@ -129,7 +129,7 @@ Data Object Properties:
129
129
  {% capture table %}
130
130
  {% assign show_page_filename = include.show_page_filename | default: "false" %}
131
131
  <table class="table dataTable">
132
- <thead class="table-light">
132
+ <thead>
133
133
  <tr>
134
134
  <th>Name</th>
135
135
  <th>Description</th>
@@ -155,7 +155,7 @@ Data Object Properties:
155
155
 
156
156
  {% capture component_table %}
157
157
  <table class="table dataTable">
158
- <thead class="table-light">
158
+ <thead>
159
159
  <tr>
160
160
  <th>Name</th>
161
161
  <th>Status</th>
@@ -0,0 +1,185 @@
1
+ // ================================================================================
2
+ // Event Calendar (@event-calendar/build) theming
3
+ // ================================================================================
4
+ // Purpose: map the CentOS color palette onto the library's own CSS custom
5
+ // properties (--ec-*) instead of hand-rolling calendar styles.
6
+ //
7
+ // `body` prefix: event-calendar.min.css loads after this theme's own
8
+ // stylesheet (see head.html.liquid) and ships its own same-specificity
9
+ // `.ec { --ec-*: ...; }` block, so a plain `.ec { }` here would lose the
10
+ // cascade. `body .ec` bumps specificity above it.
11
+ //
12
+ // Dark mode keys off Bootstrap's `[data-bs-theme="dark"]`, not the
13
+ // library's own `.ec-dark`/`.ec-auto-dark` classes, to match every other
14
+ // Bootstrap component. Two selector branches below because the attribute
15
+ // can sit on `<html>` itself or on some other ancestor (e.g. `<nav>`), and
16
+ // one selector can't match both.
17
+ // ================================================================================
18
+
19
+ body .ec {
20
+ // --ec-bg-color is never applied to .ec itself, leaving the outer
21
+ // container transparent. --ec-surface-bg-color fills that gap (declared
22
+ // once here, cascades to the dark block below).
23
+ //
24
+ // Kept separate from --ec-bg-color: the library also derives
25
+ // --ec-day-bg-color, .ec-sidebar, and .ec-col-head from --ec-bg-color, so
26
+ // feeding it $light (to match the doc preview boxes) would flatten the
27
+ // day grid to the same color and lose contrast. --ec-bg-color stays
28
+ // $white.
29
+ background-color: var(--ec-surface-bg-color);
30
+ --ec-surface-bg-color: #{$light};
31
+
32
+ --ec-bg-color: #{$white};
33
+ --ec-text-color: #{$body-color};
34
+ --ec-border-color: #{$border-color};
35
+
36
+ --ec-button-bg-color: #{$white};
37
+ --ec-button-border-color: #{$border-color};
38
+ --ec-button-text-color: var(--bs-link-color);
39
+ --ec-button-active-bg-color: #{$primary};
40
+ --ec-button-active-border-color: #{$primary};
41
+ --ec-button-active-text-color: #{$white};
42
+
43
+ // --bs-pagination-hover-* only exists inside `.pagination`, so use the
44
+ // root-scoped tokens instead — also keeps this in sync with
45
+ // [data-bs-theme] without a separate dark-mode copy.
46
+ --ec-button-hover-bg-color: var(--bs-tertiary-bg);
47
+ --ec-button-hover-text-color: var(--bs-link-hover-color);
48
+
49
+ --ec-today-bg-color: #{map-get($theme-colors, 'centos-orange-50')};
50
+ --ec-highlight-color: #{map-get($theme-colors, 'centos-purple-50')};
51
+
52
+ --ec-event-bg-color: #{$primary};
53
+ --ec-event-text-color: #{$white};
54
+ --ec-bg-event-color: #{map-get($theme-colors, 'centos-purple-200')};
55
+
56
+ --ec-now-indicator-color: #{$danger};
57
+ --ec-popup-bg-color: #{$white};
58
+
59
+ // The library only resets .ec-event-title's font-size in list view;
60
+ // elsewhere it falls through to this theme's Bootstrap h4 size. Matched
61
+ // to the calendar's own body text size instead.
62
+ //
63
+ // Grid/all-day views also set `min-block-size: 1.5em` here for tap
64
+ // targets; since the element is `display: block`, the shrunk text stays
65
+ // top-biased inside that height. Flex + centered alignment fixes that (a
66
+ // no-op where the min-height isn't set).
67
+ .ec-event-title {
68
+ font-size: #{$font-size-base};
69
+ display: flex;
70
+ align-items: center;
71
+ }
72
+
73
+ // Same h4 collision as .ec-event-title above; matched to body text size,
74
+ // kept bold so the two rows stay visually distinct. (.ec-day-head also
75
+ // doubles as the day-number cell in month view.)
76
+ .ec-day-head {
77
+ font-size: #{$font-size-base};
78
+ font-weight: 700;
79
+ }
80
+
81
+ // These are real headings, so they inherit this theme's
82
+ // `color: var(--bs-heading-color)` → `inherit` ($headings-color is
83
+ // unset). Normally that's the body color, but breaks wherever the
84
+ // calendar sits inside something that forces its own text color (e.g.
85
+ // the doc example's `.text-bg-light` preview, which forces black). Set
86
+ // explicitly instead of relying on inheritance.
87
+ .ec-title,
88
+ .ec-col-head,
89
+ .ec-day-head {
90
+ color: var(--ec-text-color);
91
+ }
92
+
93
+ // Only gets a background when event data sets one inline; our example
94
+ // events don't, so default it to the event color instead of leaving it
95
+ // invisible.
96
+ .ec-event-tag {
97
+ background-color: var(--ec-event-bg-color);
98
+ }
99
+
100
+ // .ec-header is `position: sticky`, but the library only backgrounds its
101
+ // own .ec-sidebar cell inside it — the toolbar cell stays transparent, so
102
+ // scrolled-under content shows through. .ec-toolbar gets the same
103
+ // --ec-surface-bg-color as .ec to close that gap.
104
+ //
105
+ // The library also spaces the toolbar from the body with
106
+ // `margin-block-end: 1em` (not padding), so that gap isn't painted by the
107
+ // background above. Zeroed out and replaced with equal padding instead.
108
+ .ec-toolbar {
109
+ background-color: var(--ec-surface-bg-color);
110
+ margin-block-end: 0;
111
+ padding-block-end: 1em;
112
+ }
113
+ }
114
+
115
+ // The library's hover rule shares --ec-button-active-* with .ec-active, so
116
+ // hover and the persisted selection would look identical; `:not(.ec-active)`
117
+ // leaves the active button's fill alone on hover.
118
+ body .ec .ec-button:not(:disabled):hover:not(.ec-active) {
119
+ background-color: var(--ec-button-hover-bg-color);
120
+ border-color: var(--ec-button-border-color);
121
+ color: var(--ec-button-hover-text-color);
122
+ // Avoids tying with .ec-active's z-index:1 at the grouped buttons' 1px
123
+ // overlap seam, which made hover/active flicker near that pixel.
124
+ z-index: 0;
125
+ }
126
+
127
+ // Event Calendar draws its prev/next glyph as a pure-CSS border trick (no
128
+ // icon-injection API exists). Swapped for real FontAwesome chevrons to
129
+ // match datatable's pagination icons (datatable.js). `rotate: none` cancels
130
+ // the library's LTR/RTL mirroring transform, sized for the old glyph; our
131
+ // `body .ec` prefix out-specifies its `[dir=rtl]` variant too. Coupled to
132
+ // FontAwesome's default "css" mode and "Font Awesome 7 Free" family
133
+ // (with_fontawesome_data.version default 7.0.1) — revisit if either changes.
134
+ //
135
+ // .ec-icon also needs resizing: the library sizes it at a fixed 1em for the
136
+ // old 0.5em glyph. `1.25em` matches FontAwesome's default icon width;
137
+ // `line-height: 1` mirrors FontAwesome's own rule instead of the button's 1.5.
138
+ body .ec .ec-icon.ec-prev,
139
+ body .ec .ec-icon.ec-next {
140
+ inline-size: 1.25em;
141
+ text-align: center;
142
+ line-height: 1;
143
+ }
144
+
145
+ body .ec .ec-icon.ec-prev::after,
146
+ body .ec .ec-icon.ec-next::after {
147
+ content: "\f053"; // fa-chevron-left
148
+ font-family: "Font Awesome 7 Free";
149
+ font-weight: 900;
150
+ font-style: normal; // matches FontAwesome's own .fas rule; guards against inherited italics
151
+ border: none;
152
+ rotate: none;
153
+ inset-inline-start: 0;
154
+ block-size: auto;
155
+ inline-size: auto;
156
+ }
157
+
158
+ body .ec .ec-icon.ec-next::after {
159
+ content: "\f054"; // fa-chevron-right
160
+ }
161
+
162
+ // [data-bs-theme="dark"] may sit on <html> itself or on some other ancestor
163
+ // — two branches to match both (see header comment).
164
+ html[data-bs-theme="dark"] .ec,
165
+ html [data-bs-theme="dark"] .ec {
166
+ --ec-surface-bg-color: #{$dark};
167
+ --ec-bg-color: #{$dark};
168
+ --ec-text-color: #{$light};
169
+ --ec-border-color: #{map-get($theme-colors, 'centos-purple-800')};
170
+
171
+ --ec-button-bg-color: #{$dark};
172
+ --ec-button-border-color: #{map-get($theme-colors, 'centos-purple-800')};
173
+ --ec-button-active-bg-color: #{$primary};
174
+ --ec-button-active-border-color: #{$primary};
175
+ --ec-button-active-text-color: #{$white};
176
+
177
+ --ec-today-bg-color: #{map-get($theme-colors, 'centos-orange-900')};
178
+ --ec-highlight-color: #{map-get($theme-colors, 'centos-purple-900')};
179
+
180
+ --ec-event-bg-color: #{map-get($theme-colors, 'centos-purple-400')};
181
+ --ec-event-text-color: #{$dark};
182
+ --ec-bg-event-color: #{map-get($theme-colors, 'centos-purple-800')};
183
+
184
+ --ec-popup-bg-color: #{$dark};
185
+ }
@@ -1,22 +1,24 @@
1
- // This file is for custom CSS rules and utility classes that override standard
2
- // Bootstrap structure. It should be the last file in your import sequence.
1
+ // Custom CSS rules and utility classes that override standard Bootstrap
2
+ // structure. Imported after `base/bootstrap` (so these win the cascade) and
3
+ // before third-party component overrides like base/calendar (so those win
4
+ // over these in turn).
3
5
  // Here, you define and generate custom utility classes using the variables and
4
6
  // maps that were set up previously.
5
7
 
6
8
  // ================================================================================
7
- // CSS Custom Properties (for dynamic inline styles)
9
+ // CSS Custom Properties (currently unused)
8
10
  // ================================================================================
9
- // These variables are used in head.html.liquid for dynamic CSS generation.
10
- // Defined here for centralized configuration and availability to inline styles.
11
+ // Not read anywhere — head.html.liquid computes its own scroll-offset values
12
+ // inline from Liquid data instead, and the copy-button icon size below is
13
+ // hardcoded rather than referencing --highlight-icon-width/height. Kept as a
14
+ // record of the values those should stay in sync with.
11
15
  :root {
12
16
  // Breaking News Component
13
- // Measurements used for calculating scroll-margin-top in head.html.liquid
14
17
  --breakingnews-alert-height: 31px;
15
18
  --navbar-height: 42px;
16
19
  --heading-margin-top: 48px;
17
20
 
18
21
  // Highlight.js Icon Sizing
19
- // Used for copy button icon dimensions
20
22
  --highlight-icon-width: 24px;
21
23
  --highlight-icon-height: 24px;
22
24
  }
@@ -142,7 +144,8 @@ body {
142
144
  // Excluded from CSS icon styling via .announcement class.
143
145
  // Alerts: Use CSS-based SVG icons ($centos-alert-icons map) for markdown-based
144
146
  // alerts within .content, with type-specific icons per color.
145
- // Only applied to .alert:not(.announcement) to avoid styling announcements.
147
+ // Only applied to .alert:not(.announcement):not(.breakingnews), to
148
+ // avoid styling announcements and breaking news.
146
149
 
147
150
  $centos-alert-icons: (
148
151
  "primary": url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' height='1rem' viewBox='0 0 42.333 42.333'><g transform='rotate(45 -180.13 -610.203) scale(1.0529)'><circle cx='388.123' cy='-290.716' r='20.103' style='fill:rgba(#{to-rgb(shade-color(map-get($theme-colors, 'primary'), 60%))},1);stroke:none;stroke-width:1.32292;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:fill markers stroke;stop-color:#{to-rgb(shade-color(map-get($theme-colors, 'primary'), 60%))}'/><path d='M377.366-301.473v6.301l-4.456 4.456 4.456 4.456v6.302h6.302l4.456 4.456 4.456-4.456h6.301v-6.302l4.456-4.456-4.456-4.456v-6.301h-6.301l-4.456-4.456-4.456 4.456zm2.271 4.183 1.913-1.912 3.227 3.227v1.913h-1.912zm-2.163 5.222h4.565l1.352 1.352-1.352 1.353h-4.564zm9.297-9.297h2.705v4.564l-1.352 1.353-1.353-1.353zm.091 7.607 1.261 1.282 1.26-1.283-.015 1.798 1.798-.016-1.282 1.26 1.283 1.261-1.798-.015.016 1.798-1.26-1.282-1.261 1.283.015-1.799-1.798.016 1.282-1.26-1.283-1.26 1.799.015zm-7.225 9.617 3.228-3.228h1.912v1.913l-3.227 3.227zm11.833-11.834 3.228-3.227 1.913 1.912-3.228 3.228h-1.912zm-4.698 11.345 1.352-1.352 1.352 1.352v4.564h-2.704zm6.085-6.085 1.352-1.353h4.564v2.705h-4.564zm-1.387 3.346h1.913l3.228 3.228-1.913 1.912-3.228-3.227z' style='fill:%23fff;fill-opacity:1;stroke-width:9.12808;stroke-linecap:round;paint-order:fill markers stroke;stop-color:%23000'/></g></svg>"),
@@ -192,13 +195,11 @@ $centos-alert-icons: (
192
195
 
193
196
  main {
194
197
  // --------------------------------------------------------------------------------
195
- // Navbar and linked headings' correction.
196
- //
197
- // By default, when you access page headings from the page table of content
198
- // (toc) links, the heading is hidden behind the navbar. This workaround
199
- // fixes the linked headings visibility issue in the page.
200
- // Also applies the same correction to accordion buttons for consistent behavior.
198
+ // Linked headings' bottom clearance.
201
199
  // --------------------------------------------------------------------------------
200
+ // Navbar-independent baseline spacing for anchor-linked headings/figures.
201
+ // The fixed-navbar top clearance for these same selectors lives in the
202
+ // `.has-navbar main` block near the end of this file.
202
203
  .content > h1,
203
204
  .content > h2,
204
205
  .content > h3,
@@ -289,25 +290,14 @@ main {
289
290
  color: var(--bs-primary);
290
291
  }
291
292
 
292
- // Accordion containers' correction.
293
- //
294
- // When accessing accordion containers via internal anchor links, they wouldn't be
295
- // hidden behind the navbar. This correction ensures accordion containers remain
296
- // visible when linked to, and works in conjunction with the dynamic calculation
297
- // in head.html.liquid when breaking news is present.
298
- //
299
- // Note: Applied to .accordion container (not items) to avoid disrupting accordion
300
- // item internal layout while still providing proper scroll margin and visual spacing.
293
+ // Accordion containers' bottom clearance — same as the headings/figure
294
+ // block above, applied to both `.accordion` and `.accordion-item` since an
295
+ // anchor can target either level.
301
296
  .content .accordion,
302
297
  .content .accordion-item {
303
298
  scroll-margin-bottom: 100px;
304
299
  }
305
300
 
306
- // --------------------------------------------------------------------------------
307
- // DataTable BS5 corrections
308
- // --------------------------------------------------------------------------------
309
- .content { .dt-container { margin-bottom: 1rem; } }
310
-
311
301
  // --------------------------------------------------------------------------------
312
302
  // Copy Value Component
313
303
  // --------------------------------------------------------------------------------
@@ -370,10 +360,7 @@ main {
370
360
  height: 1rem; /* Adjust icon size as needed */
371
361
  }
372
362
  code {
373
- border-left: 5px;
374
- border-top: 1px;
375
- border-right: 1px;
376
- border-bottom: 1px;
363
+ border: 1px;
377
364
  border-color: var(--bs-light-border-subtle);
378
365
  border-style: solid;
379
366
  }
@@ -0,0 +1,125 @@
1
+ // ================================================================================
2
+ // DataTables (datatables.net) BS5 theming corrections
3
+ // ================================================================================
4
+ // Purpose: fix up the parts of DataTables' Bootstrap 5 styling integration
5
+ // that don't compose cleanly with this theme's own Bootstrap variables and
6
+ // tokens.
7
+ // ================================================================================
8
+
9
+ main {
10
+ // --------------------------------------------------------------------------------
11
+ // DataTable BS5 corrections
12
+ // --------------------------------------------------------------------------------
13
+ .content { .dt-container { margin-bottom: 0.5rem; } }
14
+
15
+ // Bootstrap paints table cells from `--bs-table-bg`, not `background-color`,
16
+ // so override that variable instead of adding a class. Scoped to `thead`
17
+ // only, without requiring `.table-light`: kramdown's `{:.table .dataTable}`
18
+ // IAL can't add a class to the generated `<thead>`, so a `.table-light`
19
+ // requirement would silently skip every Markdown-authored table.
20
+ .content {
21
+ table.dataTable thead {
22
+ --bs-table-bg: var(--bs-centos-purple-100);
23
+ }
24
+ }
25
+
26
+ // DataTables' bundled CSS never reads `--bs-table-striped-bg`; it paints
27
+ // striped rows with a hardcoded black box-shadow (`--dt-row-stripe`) that
28
+ // paints over any background-color, so neither the Bootstrap variable nor
29
+ // a class has any effect. Overridden directly with `--bs-light` — the same
30
+ // token driving the DataTables wrapper's `.bg-light` (datatable.js), so
31
+ // stripe and container share one semantic color.
32
+ // `:not(:hover)` defers to the hover rule below; `:not([class])` defers to
33
+ // contextual row classes like `.table-warning`.
34
+ .content {
35
+ table.table.dataTable.table-striped > tbody > tr:nth-of-type(2n+1):not(:hover):not([class]) > * {
36
+ box-shadow: inset 0 0 0 9999px var(--bs-light);
37
+ }
38
+ }
39
+
40
+ // DataTables' own hover rule has the same box-shadow-over-background issue
41
+ // (`--dt-row-hover`, flat 7.5%-opacity black). Translucent purple composites
42
+ // over whatever's already on the row — plain, striped, or `.table-warning`
43
+ // — instead of needing to exclude any of them; alpha kept low (0.05) so it
44
+ // doesn't collide with the stripe color (`--bs-light`).
45
+ .content {
46
+ table.table.dataTable.table-hover > tbody > tr:hover > * {
47
+ box-shadow: inset 0 0 0 9999px rgba(var(--bs-primary-rgb), 0.05);
48
+ }
49
+ }
50
+
51
+ // DataTables marks sort state by opacity alone (idle/active), no hue and
52
+ // no icon-injection API — replaced with real FontAwesome glyphs so each
53
+ // header shows one icon matching its actual state. Coupled to
54
+ // with_fontawesome_data.version's default "Font Awesome 7 Free" family —
55
+ // revisit if that changes.
56
+ //
57
+ // Our selectors out-specify DataTables' own, but specificity wins per
58
+ // property, not per rule — every ::before/::after property that would
59
+ // conflict with a single centered glyph is redeclared below.
60
+ .content {
61
+ table.dataTable thead tr th .dt-column-order,
62
+ table.dataTable thead tr td .dt-column-order {
63
+ text-align: center;
64
+ line-height: 20px;
65
+ }
66
+
67
+ // Idle: orderable but not the active sort column/direction — single
68
+ // fa-sort (⇅) on ::before; ::after suppressed so only one glyph shows.
69
+ table.dataTable thead tr th.dt-orderable-asc:not(.dt-ordering-asc):not(.dt-ordering-desc) .dt-column-order::before,
70
+ table.dataTable thead tr td.dt-orderable-asc:not(.dt-ordering-asc):not(.dt-ordering-desc) .dt-column-order::before {
71
+ content: "\f0dc"; // fa-sort
72
+ font-family: "Font Awesome 7 Free";
73
+ font-weight: 900;
74
+ font-style: normal;
75
+ position: static;
76
+ line-height: inherit;
77
+ font-size: 0.8em;
78
+ opacity: 1;
79
+ color: var(--bs-centos-purple-300);
80
+ }
81
+
82
+ table.dataTable thead tr th.dt-orderable-asc:not(.dt-ordering-asc):not(.dt-ordering-desc) .dt-column-order::after,
83
+ table.dataTable thead tr td.dt-orderable-asc:not(.dt-ordering-asc):not(.dt-ordering-desc) .dt-column-order::after {
84
+ display: none;
85
+ }
86
+
87
+ // Ascending: ::before becomes fa-sort-up; ::after suppressed.
88
+ table.dataTable thead tr th.dt-ordering-asc .dt-column-order::before,
89
+ table.dataTable thead tr td.dt-ordering-asc .dt-column-order::before {
90
+ content: "\f0de"; // fa-sort-up
91
+ font-family: "Font Awesome 7 Free";
92
+ font-weight: 900;
93
+ font-style: normal;
94
+ position: static;
95
+ line-height: inherit;
96
+ font-size: 0.8em;
97
+ opacity: 1;
98
+ color: var(--bs-primary);
99
+ }
100
+
101
+ table.dataTable thead tr th.dt-ordering-asc .dt-column-order::after,
102
+ table.dataTable thead tr td.dt-ordering-asc .dt-column-order::after {
103
+ display: none;
104
+ }
105
+
106
+ // Descending: ::after becomes fa-sort-down; ::before suppressed.
107
+ table.dataTable thead tr th.dt-ordering-desc .dt-column-order::after,
108
+ table.dataTable thead tr td.dt-ordering-desc .dt-column-order::after {
109
+ content: "\f0dd"; // fa-sort-down
110
+ font-family: "Font Awesome 7 Free";
111
+ font-weight: 900;
112
+ font-style: normal;
113
+ position: static;
114
+ line-height: inherit;
115
+ font-size: 0.8em;
116
+ opacity: 1;
117
+ color: var(--bs-primary);
118
+ }
119
+
120
+ table.dataTable thead tr th.dt-ordering-desc .dt-column-order::before,
121
+ table.dataTable thead tr td.dt-ordering-desc .dt-column-order::before {
122
+ display: none;
123
+ }
124
+ }
125
+ }
@@ -33,3 +33,8 @@
33
33
 
34
34
  // 6. Add additional custom code here
35
35
  @import "base/customization";
36
+
37
+ // 7. Third-party component theme overrides (must load after our own
38
+ // customizations so component-specific corrections win the cascade).
39
+ @import "base/calendar";
40
+ @import "base/datatable";