jekyll-theme-centos 2.52.0.beta.104 → 2.52.0.beta.106

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 (86) hide show
  1. checksums.yaml +4 -4
  2. data/_config.yml +2 -2
  3. data/_data/base/accordion_schema.yml +6 -0
  4. data/_data/base/announcement_schema.yml +1 -1
  5. data/_data/base/artwork_schema.yml +17 -3
  6. data/_data/base/bits_schema.yml +9 -4
  7. data/_data/base/breadcrumb_schema.yml +14 -0
  8. data/_data/base/breakingnews_schema.yml +1 -1
  9. data/_data/base/calendar_schema.yml +17 -2
  10. data/_data/base/card_schema.yml +2 -2
  11. data/_data/base/copyright_schema.yml +7 -17
  12. data/_data/base/copyvalue_schema.yml +4 -1
  13. data/_data/base/datatable_schema.yml +3 -3
  14. data/_data/base/download_schema.yml +42 -16
  15. data/_data/base/event_schema.yml +1 -1
  16. data/_data/base/footer_schema.yml +7 -6
  17. data/_data/base/highlight_schema.yml +7 -5
  18. data/_data/base/image_schema.yml +1 -1
  19. data/_data/base/link_schema.yml +13 -19
  20. data/_data/base/navbar_schema.yml +6 -0
  21. data/_data/base/preview_schema.yml +8 -4
  22. data/_data/base/project_schema.yml +4 -2
  23. data/_data/base/script_schema.yml +4 -4
  24. data/_data/base/shortcut_schema.yml +2 -2
  25. data/_data/base/social_schema.yml +2 -2
  26. data/_data/base/sponsors.yml +3 -2
  27. data/_data/base/sponsors_schema.yml +20 -0
  28. data/_data/base/title_schema.yml +14 -0
  29. data/_data/base/toc_schema.yml +16 -2
  30. data/_includes/base/accordion-item.html.liquid +11 -32
  31. data/_includes/base/accordion.html.liquid +3 -29
  32. data/_includes/base/announcement.html.liquid +8 -35
  33. data/_includes/base/artwork.html.liquid +5 -38
  34. data/_includes/base/backtotop.html.liquid +3 -42
  35. data/_includes/base/bits.html.liquid +26 -74
  36. data/_includes/base/breadcrumb.html.liquid +15 -49
  37. data/_includes/base/breakingnews.html.liquid +6 -43
  38. data/_includes/base/calendar-events.html.liquid +3 -37
  39. data/_includes/base/calendar-init.html.liquid +7 -63
  40. data/_includes/base/calendar.html.liquid +3 -34
  41. data/_includes/base/card.html.liquid +4 -44
  42. data/_includes/base/color-table.html.liquid +18 -4
  43. data/_includes/base/configuration_variables-default-cell.html.liquid +6 -50
  44. data/_includes/base/configuration_variables-nested.html.liquid +6 -7
  45. data/_includes/base/configuration_variables.html.liquid +9 -11
  46. data/_includes/base/content.html.liquid +7 -4
  47. data/_includes/base/copyright.html.liquid +8 -39
  48. data/_includes/base/copyvalue.html.liquid +3 -70
  49. data/_includes/base/datatable.html.liquid +4 -40
  50. data/_includes/base/download.html.liquid +12 -66
  51. data/_includes/base/download_architecture.html.liquid +29 -117
  52. data/_includes/base/download_commands.html.liquid +2 -14
  53. data/_includes/base/download_documentation.html.liquid +13 -47
  54. data/_includes/base/download_eol.html.liquid +5 -15
  55. data/_includes/base/download_filevalue.html.liquid +9 -49
  56. data/_includes/base/download_screenshots.html.liquid +10 -65
  57. data/_includes/base/download_sections.html.liquid +2 -19
  58. data/_includes/base/event.html.liquid +8 -63
  59. data/_includes/base/fontawesome.html.liquid +4 -38
  60. data/_includes/base/footer.html.liquid +9 -2
  61. data/_includes/base/head.html.liquid +6 -47
  62. data/_includes/base/highlight.html.liquid +4 -37
  63. data/_includes/base/image.html.liquid +5 -22
  64. data/_includes/base/link.html.liquid +38 -57
  65. data/_includes/base/locales.html.liquid +6 -26
  66. data/_includes/base/navbar.html.liquid +16 -45
  67. data/_includes/base/navindex.html.liquid +40 -111
  68. data/_includes/base/ogp.html.liquid +17 -83
  69. data/_includes/base/preview.html.liquid +18 -57
  70. data/_includes/base/project.html.liquid +4 -29
  71. data/_includes/base/shortcut.html.liquid +7 -37
  72. data/_includes/base/social.html.liquid +4 -42
  73. data/_includes/base/sponsors-cards.html.liquid +4 -55
  74. data/_includes/base/sponsors-carousel.html.liquid +11 -59
  75. data/_includes/base/sponsors-data.html.liquid +32 -0
  76. data/_includes/base/title.html.liquid +5 -42
  77. data/_includes/base/toc-generator.html.liquid +4 -0
  78. data/_includes/base/toc.html.liquid +28 -81
  79. data/_sass/base/_customization.scss +18 -0
  80. data/_sass/base/_preview.scss +5 -9
  81. data/assets/icons/favicon.ico +0 -0
  82. data/assets/js/base/backtotop.js +3 -3
  83. data/assets/js/base/copyvalue.js +15 -11
  84. data/assets/js/base/datatable.js +6 -13
  85. data/assets/js/base/highlight.js +46 -31
  86. metadata +2 -1
@@ -27,6 +27,13 @@ properties:
27
27
  type: string
28
28
  default: ""
29
29
  description: Introductory text rendered above the carousel, supports Markdown.
30
+ closing_message:
31
+ type: string
32
+ default: ""
33
+ description: >-
34
+ Closing text rendered below the carousel, supports Markdown. Use it
35
+ to invite visitors to act, e.g. to link to a page about becoming a
36
+ sponsor.
30
37
  # NOTE: this default is hardcoded to match examples/jekyll/components/
31
38
  # sponsors.md's current page.url (/components/sponsors/), not computed
32
39
  # from it (YAML can't run Liquid). If that page is ever renamed or its
@@ -79,4 +86,17 @@ properties:
79
86
  required:
80
87
  - members
81
88
  additionalProperties: false
89
+ id:
90
+ type: string
91
+ default: sponsorsCarousel
92
+ description: >-
93
+ Include parameter for `sponsors-carousel.html.liquid`. The DOM id of
94
+ the carousel wrapper. Give each carousel a distinct `id` when a page
95
+ shows more than one.
96
+ with_title:
97
+ type: boolean
98
+ default: true
99
+ description: >-
100
+ Include parameter for `sponsors-carousel.html.liquid`. Set to `false`
101
+ to hide the title, icon, and message above the carousel.
82
102
  additionalProperties: false
@@ -48,4 +48,18 @@ properties:
48
48
  required:
49
49
  - title
50
50
  additionalProperties: false
51
+ row_class:
52
+ type: string
53
+ description: >-
54
+ Include parameter. CSS classes for the wrapping `div.row`. When
55
+ omitted, the content component's `row_class` default applies. The
56
+ content component passes its own `row_class` here, so every row
57
+ inside `<main>` shares the same spacing.
58
+ column_class:
59
+ type: string
60
+ description: >-
61
+ Include parameter. CSS classes for the column `div` inside the row.
62
+ When omitted, the content component's `col_class` default applies.
63
+ The content component passes its own `col_class` here, so every row
64
+ inside `<main>` shares the same column width.
51
65
  additionalProperties: false
@@ -26,13 +26,13 @@ properties:
26
26
  Multiple classes can be specified separated by spaces (e.g., `my-custom-class another-class`).
27
27
  id:
28
28
  type: string
29
- default: ""
29
+ default: "page-toc"
30
30
  description: >-
31
31
  The HTML ID attribute assigned to the TOC root list element, used for targeting
32
32
  with CSS or JavaScript (e.g., `page-toc`).
33
33
  item_class:
34
34
  type: string
35
- default: ""
35
+ default: "my-2"
36
36
  description: >-
37
37
  CSS class(es) applied to each list item in the TOC. Supports the `%level%`
38
38
  placeholder which is replaced with the current heading level (e.g., `my-2.%level%`).
@@ -111,4 +111,18 @@ properties:
111
111
  Deprecated. Use `skip_no_ids` instead. When provided, a deprecation warning
112
112
  comment is emitted in the HTML output.
113
113
  additionalProperties: false
114
+ row_class:
115
+ type: string
116
+ description: >-
117
+ Include parameter. CSS classes for the wrapping `div.row`. When
118
+ omitted, the content component's `row_class` default applies. The
119
+ content component passes its own `row_class` here, so every row
120
+ inside `<main>` shares the same spacing.
121
+ column_class:
122
+ type: string
123
+ description: >-
124
+ Include parameter. CSS classes for the column `div` inside the row.
125
+ When omitted, the content component's `col_class` default applies.
126
+ The content component passes its own `col_class` here, so every row
127
+ inside `<main>` shares the same column width.
114
128
  additionalProperties: false
@@ -1,29 +1,6 @@
1
1
  {% comment %}
2
- ================================================================================
3
- Template: Accordion Item Component
4
- Purpose: Renders a single Bootstrap accordion-item (header/button/collapse/
5
- body), the shared shell for one collapsible entry within an accordion.
6
- Pairs with accordion.html.liquid, which renders the surrounding wrapper —
7
- this component only renders one item; callers loop/capture as many as they
8
- need and pass the concatenated result to accordion.html.liquid as `items`.
9
-
10
- Design Logic:
11
- - Bootstrap's accordion-item/header/button/collapse/body markup, driven
12
- entirely by include parameters — no data-source fallback chain
13
- - `item_id`/`accordion_id` scope this item's collapse behavior to the
14
- caller-supplied parent accordion via `data-bs-parent`
15
- - `expanded` toggles the initial open/closed state across button, collapse
16
- container, and ARIA attributes together
17
-
18
- Optional Inputs:
19
- - title_class: Classes for the title span, replacing the "ms-1" default
20
- (e.g. "ms-1 fw-bold" for a bold title).
21
- - body_class: Extra classes appended to "accordion-body" (e.g. "p-0" to
22
- remove body padding when the content supplies its own).
23
-
24
- Data Source:
25
- - Derived from include parameters only
26
- ================================================================================
2
+ accordion-item: renders one Bootstrap accordion item whose collapse is scoped to the parent accordion_id.
3
+ Schema: src/YAML/accordion_schema.yml
27
4
  {% endcomment %}
28
5
 
29
6
  {%- assign with_accordion_item_schema = site.data.base.accordion_schema.properties.item.properties %}
@@ -31,19 +8,21 @@ Data Source:
31
8
  {%- assign accordion_item_icon = include.icon | default: with_accordion_item_schema.icon.default %}
32
9
  {%- assign accordion_item_title = include.title | default: with_accordion_item_schema.title.default %}
33
10
  {%- assign accordion_item_title_class = include.title_class | default: with_accordion_item_schema.title_class.default %}
11
+ {%- comment %} == nil tells an omitted header_class apart from an explicit "", which removes the heading style. {% endcomment %}
12
+ {%- assign accordion_item_header_class = include.header_class %}
13
+ {%- if include.header_class == nil %}
14
+ {%- assign accordion_item_header_class = with_accordion_item_schema.header_class.default %}
15
+ {%- endif %}
34
16
  {%- assign accordion_item_item_id = include.item_id | default: with_accordion_item_schema.item_id.default %}
35
17
  {%- assign accordion_item_accordion_id = include.accordion_id | default: with_accordion_item_schema.accordion_id.default %}
36
18
  {%- assign accordion_item_expanded = include.expanded | default: with_accordion_item_schema.expanded.default %}
37
19
  {%- assign accordion_item_body = include.body | default: with_accordion_item_schema.body.default %}
38
- {%- assign accordion_item_body_class = include.body_class | default: with_accordion_item_schema.body_class.default %}
39
-
40
- {%- comment %} === Presentation === {% endcomment %}
41
- {%- comment %} --- HTML --- {% endcomment -%}
20
+ {%- assign accordion_item_body_class = include.body_class | default: with_accordion_item_schema.body_class.default -%}
42
21
  <div class="accordion-item">
43
- <div class="accordion-header h2">
22
+ <div class="accordion-header{% if accordion_item_header_class != "" %} {{ accordion_item_header_class }}{% endif %}">
44
23
  <button class="accordion-button{% unless accordion_item_expanded %} collapsed{% endunless %}" type="button" data-bs-toggle="collapse" data-bs-target="#{{ accordion_item_item_id }}" aria-expanded="{{ accordion_item_expanded }}" aria-controls="{{ accordion_item_item_id }}">
45
- <i class="{{ accordion_item_icon }} me-2"></i>
46
- <span{% unless accordion_item_title_class == blank %} class="{{ accordion_item_title_class }}"{% endunless %}>{{ accordion_item_title }}</span>
24
+ <i class="{{ accordion_item_icon }} me-2" aria-hidden="true"></i>
25
+ <span{% if accordion_item_title_class != "" %} class="{{ accordion_item_title_class }}"{% endif %}>{{ accordion_item_title }}</span>
47
26
  </button>
48
27
  </div>
49
28
  <div id="{{ accordion_item_item_id }}" class="accordion-collapse collapse{% if accordion_item_expanded %} show{% endif %}" data-bs-parent="#{{ accordion_item_accordion_id }}">
@@ -1,39 +1,13 @@
1
1
  {% comment %}
2
- ================================================================================
3
- Template: Accordion Wrapper Component
4
- Purpose: Renders the Bootstrap accordion wrapper `<div class="accordion"
5
- id="...">`, given a pre-rendered HTML string of one or more accordion-item
6
- includes. Pairs with accordion-item.html.liquid, which renders each
7
- individual item — see that file for the item-level markup. Callers build
8
- `items` via a capture tag: loop-and-append when the item count is dynamic
9
- (see bits.html.liquid), or capture several sibling accordion-item includes
10
- together when the items are fixed (see download_sections.html.liquid).
11
-
12
- Design Logic:
13
- - Wrapper only: no looping over structured item data — Jekyll's Liquid
14
- include mechanism has no block/yield content-passing, so per-item body
15
- content must already be caller-rendered HTML by the time it reaches this
16
- component
17
- - `id` is the scoping anchor every child accordion-item's `accordion_id`
18
- parameter must match, via `data-bs-parent`
19
-
20
- Optional Inputs:
21
- - class: Extra classes appended to "accordion" (e.g. "accordion-flush
22
- mt-3", "w-100 mb-3").
23
-
24
- Data Source:
25
- - Derived from include parameters only
26
- ================================================================================
2
+ accordion: renders a Bootstrap accordion wrapper around the caller-built accordion-item HTML passed as items.
3
+ Schema: src/YAML/accordion_schema.yml
27
4
  {% endcomment %}
28
5
 
29
6
  {%- assign with_accordion_schema = site.data.base.accordion_schema.properties %}
30
7
 
31
8
  {%- assign accordion_id = include.id | default: with_accordion_schema.id.default %}
32
9
  {%- assign accordion_class = include.class | default: with_accordion_schema.class.default %}
33
- {%- assign accordion_items = include.items | default: with_accordion_schema.items.default %}
34
-
35
- {%- comment %} === Presentation === {% endcomment %}
36
- {%- comment %} --- HTML --- {% endcomment -%}
10
+ {%- assign accordion_items = include.items | default: with_accordion_schema.items.default -%}
37
11
  <div class="accordion{% if accordion_class != "" %} {{ accordion_class }}{% endif %}" id="{{ accordion_id }}">
38
12
  {{- accordion_items -}}
39
13
  </div>
@@ -1,31 +1,8 @@
1
- {%- comment %}
2
- ================================================================================
3
- Template: Announcement Component
4
- Purpose: Renders dismissible alert boxes with icon and content.
5
- ================================================================================
6
-
7
- Design Logic:
8
- - Multi-level data source hierarchy for flexibility
9
- - Dismissible alerts for user visibility management
10
- - Icon and color support for visual categorization
11
- - Looping structure for multiple announcements
12
- - Consistent fallback chain for content
13
-
14
- Required Inputs:
15
- - content: The announcement message or HTML content
16
-
17
- Optional Inputs:
18
- - data: Array of announcement objects (overrides fallbacks)
19
- - color: Alert color scheme (default: 'primary')
20
- - icon: Icon class for Font Awesome (default: 'fa-solid fa-bullhorn')
21
-
22
- Data Source Hierarchy (priority):
23
- 1. include.data
24
- 2. page.with_announcement_data
25
- 3. site.data.announcement
26
- 4. site.data.base.announcement
27
- ================================================================================
28
- {%- endcomment %}
1
+ {% comment %}
2
+ announcement: renders each announcement as a dismissible alert with an icon.
3
+ Data: include.data > page.with_announcement_data > site.data.announcement > site.data.base.announcement
4
+ Schema: src/YAML/announcement_schema.yml
5
+ {% endcomment %}
29
6
 
30
7
  {%- assign with_announcement = include.with_announcement
31
8
  | default: page.with_announcement
@@ -40,22 +17,18 @@ Data Source Hierarchy (priority):
40
17
  {%- if with_announcement %}
41
18
 
42
19
  {%- assign with_announcement_schema = site.data.base.announcement_schema.properties.with_announcement_data.items.properties %}
43
-
44
- {%- comment %} === Presentation === {% endcomment %}
45
20
  {%- for announcement in with_announcement_data %}
46
-
47
- {%- comment %} --- Defaults --- {% endcomment %}
48
21
  {%- assign announcement_color = announcement.color | default: with_announcement_schema.color.default %}
49
22
  {%- assign announcement_icon = announcement.icon | default: with_announcement_schema.icon.default %}
50
-
51
- {%- comment %} --- HTML --- {% endcomment %}
23
+ {%- comment %} The pinned Liquid has no remove_last, so split/join drops the trailing "</p>" markdownify adds. {% endcomment %}
24
+ {%- assign announcement_content_html = announcement.content | markdownify | strip | remove_first: "<p>" | split: "</p>" | join: "</p>" | strip %}
52
25
  <div class="announcement alert alert-{{ announcement_color }} alert-dismissible fade show shadow mb-3" role="alert">
53
26
  <div class="d-flex justify-content-between align-items-center">
54
27
  <div class="me-3">
55
28
  <div class="h6 my-1"><i class="{{ announcement_icon }}"></i></div>
56
29
  </div>
57
30
  <p class="flex-fill text-start mb-0">
58
- {{- announcement.content }}
31
+ {{- announcement_content_html }}
59
32
  </p>
60
33
  </div>
61
34
  <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
@@ -1,34 +1,7 @@
1
1
  {% comment %}
2
- ================================================================================
3
- Template: Artwork Component
4
- Purpose: Renders the responsive centos-motif background (.bg-artwork, see
5
- src/SASS/_customization.scss) at breakpoint-appropriate sizes.
6
- ================================================================================
7
-
8
- Design Logic:
9
- - Background image comes entirely from the .bg-artwork CSS class (breakpoint
10
- URLs are hardcoded in SCSS) — this component does not accept a custom image
11
- - Schema-based defaults for consistent styling
12
- - role="img" + aria-label for accessibility, since there is no <img> element
13
-
14
- Optional Inputs:
15
- - alt: Text used as the element's aria-label
16
- - class: Container div CSS classes
17
- - image_class: CSS classes for the .bg-artwork element itself, including the Bootstrap
18
- `ratio` + `ratio-*` modifier classes that control presentation ratio
19
- - data: Artwork data object (overrides fallbacks)
20
- - column_class: Bootstrap column class for the row wrapper (set by the layout to
21
- keep this component aligned with the content column; defaults to "col")
22
- - row_class: Bootstrap class(es) for the row wrapper (set by the layout to
23
- keep this component's row aligned with breadcrumb, title, toc, and
24
- content; defaults to "row mb-3")
25
-
26
- Data Source Hierarchy (priority):
27
- 1. include.data
28
- 2. page.with_artwork_data
29
- 3. site.data.artwork
30
- 4. site.data.base.artwork
31
- ================================================================================
2
+ artwork: renders the .bg-artwork background box inside a row and column; content.html.liquid sets row_class and column_class.
3
+ Data: include.data > page.with_artwork_data > site.data.artwork > site.data.base.artwork
4
+ Schema: src/YAML/artwork_schema.yml
32
5
  {% endcomment %}
33
6
 
34
7
  {%- assign with_artwork = include.with_artwork
@@ -44,17 +17,11 @@ Data Source Hierarchy (priority):
44
17
  {%- if with_artwork %}
45
18
 
46
19
  {%- assign with_artwork_schema = site.data.base.artwork_schema.properties.with_artwork_data.properties %}
47
-
48
- {%- comment %} === Presentation === {% endcomment %}
49
-
50
- {%- comment %} --- Defaults --- {% endcomment %}
51
20
  {%- assign artwork_alt = with_artwork_data.alt | default: with_artwork_schema.alt.default %}
52
21
  {%- assign artwork_class = with_artwork_data.class | default: with_artwork_schema.class.default %}
53
22
  {%- assign artwork_image_class = with_artwork_data.image_class | default: with_artwork_schema.image_class.default %}
54
- {%- assign column_class = include.column_class | default: 'col' %}
55
- {%- assign row_class = include.row_class | default: 'row mb-3' %}
56
-
57
- {%- comment %} --- HTML --- {% endcomment %}
23
+ {%- assign column_class = include.column_class | default: site.data.base.content_schema.properties.with_content_data.properties.col_class.default %}
24
+ {%- assign row_class = include.row_class | default: site.data.base.content_schema.properties.with_content_data.properties.row_class.default %}
58
25
  <div class="{{ row_class }}">
59
26
  <div class="{{ column_class }}">
60
27
  <div class="{{ artwork_class }}">
@@ -1,31 +1,7 @@
1
1
  {% comment %}
2
- ================================================================================
3
- Template: Back-to-Top Button Component
4
- Purpose: Loads vanilla-back-to-top library for floating scroll-to-top button.
5
- Customizable size and colors with CDN-based loading.
6
- ================================================================================
7
-
8
- Design Logic:
9
- - CDN-based library loading for performance
10
- - Configurable button size (diameter) and colors
11
- - Floating button widget (standard UX pattern)
12
- - Vanilla JavaScript (no jQuery dependency)
13
- - Schema-based defaults
14
-
15
- Optional Inputs:
16
- - cdn: CDN base URL (defaults to unpkg.com)
17
- - version: Library version (e.g., "7.0.4")
18
- - diameter: Button diameter in pixels (default: 56)
19
- - background_color: Button background color (CSS hex)
20
- - text_color: Button text/icon color (CSS hex)
21
- - data: Configuration object (overrides fallbacks)
22
-
23
- Data Source Hierarchy (priority):
24
- 1. include.data
25
- 2. page.with_backtotop_data
26
- 3. site.data.backtotop
27
- 4. site.data.base.backtotop
28
- ================================================================================
2
+ backtotop: loads vanilla-back-to-top from the CDN and the theme script that creates the button.
3
+ Data: include.data > page.with_backtotop_data > site.data.backtotop > site.data.base.backtotop
4
+ Schema: src/YAML/backtotop_schema.yml
29
5
  {% endcomment %}
30
6
 
31
7
  {%- assign with_backtotop = include.with_backtotop
@@ -41,32 +17,17 @@ Data Source Hierarchy (priority):
41
17
  {%- assign with_backtotop_schema = site.data.base.backtotop_schema.properties.with_backtotop_data.properties %}
42
18
 
43
19
  {%- if with_backtotop %}
44
-
45
- {%- comment %} === Presentation === {% endcomment %}
46
-
47
- {%- comment %} --- Defaults --- {% endcomment %}
48
20
  {%- assign backtotop_cdn = with_backtotop_data.cdn | default: with_backtotop_schema.cdn.default %}
49
21
  {%- assign backtotop_version = with_backtotop_data.version | default: with_backtotop_schema.version.default %}
50
22
  {%- assign backtotop_script_integrity = with_backtotop_data.script_integrity | default: with_backtotop_schema.script_integrity.default %}
51
23
  {%- assign backtotop_diameter = with_backtotop_data.diameter | default: with_backtotop_schema.diameter.default %}
52
24
  {%- assign backtotop_background_color = with_backtotop_data.background_color | default: with_backtotop_schema.background_color.default %}
53
25
  {%- assign backtotop_text_color = with_backtotop_data.text_color | default: with_backtotop_schema.text_color.default %}
54
-
55
- {%- comment %} --- HTML --- {% endcomment %}
56
- <!-- Load vanilla-back-to-top library from CDN -->
57
26
  <script src="{{ backtotop_cdn }}/vanilla-back-to-top@{{ backtotop_version }}/dist/vanilla-back-to-top.min.js" integrity="{{ backtotop_script_integrity }}" crossorigin="anonymous" referrerpolicy="no-referrer" defer></script>
58
-
59
- <!-- Initialize back-to-top button with configuration via data attributes -->
60
27
  <script id="centos-backtop"
61
- {%- if with_backtotop_data.diameter %}
62
28
  data-diameter="{{ backtotop_diameter }}"
63
- {%- endif %}
64
- {%- if with_backtotop_data.background_color %}
65
29
  data-background-color="{{ backtotop_background_color }}"
66
- {%- endif %}
67
- {%- if with_backtotop_data.text_color %}
68
30
  data-text-color="{{ backtotop_text_color }}"
69
- {%- endif %}
70
31
  src="{{ site.baseurl }}/assets/js/base/backtotop.min.js"
71
32
  defer></script>
72
33
 
@@ -1,47 +1,7 @@
1
1
  {% comment %}
2
- ================================================================================
3
- Template: Bits Component (Upstream/Downstream Relationships)
4
- Purpose: Renders upstream/downstream relationships — each upstream Bit as a
5
- preamble/card/finale block, followed by its related downstream Bits in one
6
- of two switchable presentation styles.
7
-
8
- Design Logic:
9
- - Hierarchical relationships: upstream parent, downstream children, linked
10
- by matching `relationship` to the upstream's `name`
11
- - Card-based presentation: reuses base/card.html.liquid for the upstream Bit
12
- - Switchable downstream presentation, picked per upstream Bit via
13
- `downstream_style`: `card` (default, fixed 3-item preview grid) or
14
- `accordion` (every related item, optionally capped via `downstream_limit`)
15
- - Optional sections: preamble, finale, "View All" link (shown once the
16
- downstream count exceeds the effective style cap)
17
- - Per-item downstream card width: each downstream Bit's own `col_class`
18
- (card style only) controls its Bootstrap grid column class, so cards in the
19
- same row need not be equal width
20
-
21
- Required Inputs (from data objects):
22
- - type: 'upstream' or 'downstream'
23
- - name: Component name
24
- - relationship: For downstream, name of its upstream parent
25
-
26
- Optional Inputs (from data objects):
27
- - description, screenshot, icon, image, actions, color
28
- - preamble, finale: Text before/after the upstream card; each falls back to
29
- its own schema-documented default when omitted — set explicitly to `false`
30
- or an empty string to render neither element instead
31
- - class, card_class, preamble_class, finale_class: Custom styling
32
- - downstream_style: 'card' (default) or 'accordion'
33
- - downstream_limit: accordion style only; caps items shown, omit for
34
- unlimited (all shown, "View All" link never rendered)
35
- - col_class: card style only; Bootstrap column class per downstream card
36
- (default: three-across)
37
- - index_page_name, index_page_url: For the "View All" link
38
-
39
- Data Source Hierarchy (priority order):
40
- 1. include.data
41
- 2. page.with_bits_data
42
- 3. site.data.bits
43
- 4. site.data.base.bits
44
- ================================================================================
2
+ bits: renders each upstream bit as a card followed by its downstream bits as a card grid or an accordion.
3
+ Data: include.data > page.with_bits_data > site.data.bits > site.data.base.bits
4
+ Schema: src/YAML/bits_schema.yml
45
5
  {% endcomment %}
46
6
 
47
7
  {%- assign with_bits = include.with_bits
@@ -57,12 +17,8 @@ Data Source Hierarchy (priority order):
57
17
  {%- assign with_bits_schema = site.data.base.bits_schema.properties.with_bits_data.items.properties %}
58
18
 
59
19
  {%- if with_bits %}
60
-
61
- {%- comment %} === Presentation === {% endcomment %}
62
20
  {%- assign upstream_bits = with_bits_data | where: "type", "upstream" %}
63
21
  {%- for upstream_bit in upstream_bits %}
64
-
65
- {%- comment %} --- Upstream Defaults --- {% endcomment %}
66
22
  {%- assign upstream_bit_id = upstream_bit.name | replace: " ", "" | capitalize %}
67
23
  {%- assign upstream_bit_class = upstream_bit.class | default: with_bits_schema.class.default %}
68
24
  {%- assign upstream_bit_card_class = upstream_bit.card_class | default: with_bits_schema.card_class.default %}
@@ -73,6 +29,7 @@ Data Source Hierarchy (priority order):
73
29
  {%- assign upstream_bit_index_page_url = upstream_bit.index_page_url | default: with_bits_schema.index_page_url.default %}
74
30
  {%- assign upstream_bit_screenshot_class = upstream_bit.screenshot_class | default: with_bits_schema.screenshot_class.default %}
75
31
  {%- assign upstream_bit_actions_class = upstream_bit.actions_class | default: with_bits_schema.actions_class.default %}
32
+ {%- comment %} == nil tells an omitted preamble or finale apart from an explicit false or "", which hide it. {% endcomment %}
76
33
  {%- assign upstream_bit_preamble = upstream_bit.preamble %}
77
34
  {%- if upstream_bit.preamble == nil %}
78
35
  {%- assign upstream_bit_preamble = with_bits_schema.preamble.default %}
@@ -81,19 +38,18 @@ Data Source Hierarchy (priority order):
81
38
  {%- if upstream_bit.finale == nil %}
82
39
  {%- assign upstream_bit_finale = with_bits_schema.finale.default %}
83
40
  {%- endif %}
84
- {%- assign upstream_bit_btn_class = "btn btn-sm m-1 btn-" | append: upstream_bit_color %}
41
+ {%- comment %} The pinned Liquid has no remove_last, so split/join drops the trailing "</p>" markdownify adds. {% endcomment %}
42
+ {%- assign upstream_bit_preamble_html = upstream_bit_preamble | markdownify | strip | remove_first: "<p>" | split: "</p>" | join: "</p>" | strip %}
43
+ {%- assign upstream_bit_finale_html = upstream_bit_finale | markdownify | strip | remove_first: "<p>" | split: "</p>" | join: "</p>" | strip %}
44
+ {%- assign upstream_bit_btn_class = "btn btn-sm m-1 btn-{color}" | replace: "{color}", upstream_bit_color %}
85
45
  {%- assign upstream_bit_downstream_style = upstream_bit.downstream_style | default: with_bits_schema.downstream_style.default %}
86
46
  {%- assign upstream_bit_downstream_limit = upstream_bit.downstream_limit %}
87
47
  {%- assign card_style_downstream_cap = 3 %}
88
48
 
89
49
  <div class="d-flex flex-column{% if upstream_bit_class != "" %} {{ upstream_bit_class }}{% endif %}">
90
-
91
- {%- comment %} --- Upstream Preamble --- {% endcomment %}
92
50
  {%- if upstream_bit_preamble and upstream_bit_preamble != empty %}
93
- <p{% if upstream_bit_preamble_class != "" %} class="{{ upstream_bit_preamble_class }}"{% endif %}>{{ upstream_bit_preamble }}</p>
51
+ <p{% if upstream_bit_preamble_class != "" %} class="{{ upstream_bit_preamble_class }}"{% endif %}>{{ upstream_bit_preamble_html }}</p>
94
52
  {%- endif %}
95
-
96
- {%- comment %} --- Upstream Card --- {% endcomment %}
97
53
  {%- include base/card.html.liquid
98
54
  class = upstream_bit_card_class
99
55
  screenshot = upstream_bit.screenshot
@@ -114,8 +70,6 @@ Data Source Hierarchy (priority order):
114
70
  actions_class = upstream_bit_actions_class
115
71
  color = upstream_bit_color
116
72
  -%}
117
-
118
- {%- comment %} --- Upstream Finale (Downstream Introduction) --- {% endcomment %}
119
73
  {%- assign downstream_bits = with_bits_data | where: "type", "downstream" | where: "relationship", upstream_bit.name %}
120
74
  {%- assign downstream_bit_total = downstream_bits | size %}
121
75
  {%- assign downstream_bit_index_name = upstream_bit_index_page_name | append: " (" | append: downstream_bit_total | append: ")" %}
@@ -132,7 +86,7 @@ Data Source Hierarchy (priority order):
132
86
 
133
87
  {%- if upstream_bit_finale and upstream_bit_finale != empty %}
134
88
  <div class="d-flex flex-row w-100 justify-content-between align-items-center">
135
- <p class="m-1{% if upstream_bit_finale_class != "" %} {{ upstream_bit_finale_class }}{% endif %}">{{ upstream_bit_finale }}</p>
89
+ <p class="m-1{% if upstream_bit_finale_class != "" %} {{ upstream_bit_finale_class }}{% endif %}">{{ upstream_bit_finale_html }}</p>
136
90
  {%- if show_index_link %}
137
91
  <div class="m-1">
138
92
  {%- include base/link.html.liquid
@@ -146,8 +100,6 @@ Data Source Hierarchy (priority order):
146
100
  {%- endif %}
147
101
  </div>
148
102
  {%- endif %}
149
-
150
- {%- comment %} --- Downstream Items --- {% endcomment %}
151
103
  {%- if downstream_display_limit %}
152
104
  {%- assign visible_downstream_bits = downstream_bits | slice: 0, downstream_display_limit %}
153
105
  {%- else %}
@@ -163,23 +115,11 @@ Data Source Hierarchy (priority order):
163
115
 
164
116
  {%- capture downstream_items_html %}
165
117
  {%- for downstream_bit in visible_downstream_bits %}
166
- {%- assign downstream_bit_first_action = downstream_bit.actions | first %}
167
- {%- capture downstream_bit_action_button %}
168
- {%- if downstream_bit_first_action %}
169
- {%- include base/link.html.liquid
170
- name = downstream_bit_first_action.name
171
- link = downstream_bit_first_action.link
172
- class = upstream_bit_btn_class
173
- icon = downstream_bit_first_action.icon
174
- icon_position = downstream_bit_first_action.icon_position
175
- -%}
176
- {%- endif %}
177
- {%- endcapture %}
178
-
118
+ {%- assign downstream_bit_description_html = downstream_bit.description | markdownify | strip | remove_first: "<p>" | split: "</p>" | join: "</p>" | strip %}
179
119
  {%- capture downstream_bit_media %}
180
120
  {% if downstream_bit.screenshot and downstream_bit.screenshot != "" %}
181
121
  <div class="bg-{{ upstream_bit_color }} rounded-top">
182
- <img src="{{ site.baseurl }}/assets/img/{{ downstream_bit.screenshot }}" class="{{ downstream_item_img_class }}" alt="{{ downstream_bit.screenshot }}">
122
+ <img src="{{ site.baseurl }}/assets/img/{{ downstream_bit.screenshot }}" class="{{ downstream_item_img_class }}" alt="{{ downstream_bit.screenshot_alt | default: downstream_bit.screenshot }}">
183
123
  </div>
184
124
  {% endif %}
185
125
  {%- endcapture %}
@@ -204,7 +144,7 @@ Data Source Hierarchy (priority order):
204
144
  {%- endcapture %}
205
145
  {%- capture downstream_bit_body %}
206
146
  {{- downstream_bit_media | strip -}}
207
- <p class="card-text mt-3">{{ downstream_bit.description }}</p>
147
+ <p class="card-text mt-3">{{ downstream_bit_description_html }}</p>
208
148
  {{ downstream_bit_actions_full }}
209
149
  {%- endcapture %}
210
150
  {%- include base/accordion-item.html.liquid
@@ -217,12 +157,24 @@ Data Source Hierarchy (priority order):
217
157
  -%}
218
158
  {%- else %}
219
159
  {%- assign downstream_bit_col_class = downstream_bit.col_class | default: with_bits_schema.col_class.default %}
160
+ {%- assign downstream_bit_first_action = downstream_bit.actions | first %}
161
+ {%- capture downstream_bit_action_button %}
162
+ {%- if downstream_bit_first_action %}
163
+ {%- include base/link.html.liquid
164
+ name = downstream_bit_first_action.name
165
+ link = downstream_bit_first_action.link
166
+ class = upstream_bit_btn_class
167
+ icon = downstream_bit_first_action.icon
168
+ icon_position = downstream_bit_first_action.icon_position
169
+ -%}
170
+ {%- endif %}
171
+ {%- endcapture %}
220
172
  <div class="{{ downstream_bit_col_class }}">
221
173
  <div class="card border-{{ upstream_bit_color }}-subtle h-100">
222
174
  {{- downstream_bit_media | strip -}}
223
175
  <div class="card-body">
224
176
  <p class="h5 card-title">{{ downstream_bit.name }}</p>
225
- <p class="card-text">{{ downstream_bit.description }}</p>
177
+ <p class="card-text">{{ downstream_bit_description_html }}</p>
226
178
  {{ downstream_bit_action_button }}
227
179
  </div>
228
180
  </div>