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
@@ -1,18 +1,6 @@
1
1
  {% comment %}
2
- ================================================================================
3
- Utility: Download Commands List
4
- Purpose: Command snippets for one release, rendered as one collapsible item
5
- inside download_sections.html.liquid's shared documentation/commands/eol
6
- accordion — release-wide metadata that applies in common to every
7
- architecture above. Called from download_sections.html.liquid.
8
-
9
- Required Inputs:
10
- - commands: Array of {title, lines}
11
- - accordion_id: Parent accordion's id, for data-bs-parent scoping
12
- - item_id: This item's unique collapse id
13
- - expanded: true starts this item open; false starts it closed. Passed
14
- through from the caller (see download_sections.html.liquid).
15
- ================================================================================
2
+ download_commands: renders a release's commands as one accordion item titled Migration.
3
+ Schema: src/YAML/download_schema.yml
16
4
  {% endcomment %}
17
5
  {%- capture download_commands_body -%}
18
6
  {%- for row in include.commands %}
@@ -1,54 +1,20 @@
1
1
  {% comment %}
2
- ================================================================================
3
- Utility: Download Documentation List
4
- Purpose: Documentation links for one release, rendered as one collapsible
5
- item inside download_sections.html.liquid's shared documentation/commands/
6
- eol/screenshots accordion — release-wide metadata that applies in common to
7
- every architecture above. Called from download_sections.html.liquid.
8
-
9
- Required Inputs:
10
- - documentation: Array of {title, link, description}
11
- - accordion_id: Parent accordion's id, for data-bs-parent scoping
12
- - item_id: This item's unique collapse id
13
- - expanded: true starts this item open; false starts it closed. Passed
14
- through from the caller (see download_sections.html.liquid).
15
-
16
- An entry's optional `description` switches its own presentation rather than
17
- attaching a caption to a button: a bare button reads as a call to action
18
- ("do this now"), a mismatched signifier for a full explanatory sentence
19
- sitting next to it — so once there's a sentence to say, the entry renders as
20
- one prose paragraph with `title` as the inline link and `description`
21
- continuing the sentence grammatically (e.g. "Release Notes are continuously
22
- updated..."), the standard, immediately-recognizable convention for
23
- referencing a resource from explanatory text. Entries without a description
24
- still render as a bare button, identical to before this field existed —
25
- prose and buttons render as two separate groups (prose first, since it's the
26
- richer content) rather than interleaved, so a documentation list mixing both
27
- kinds doesn't end up with paragraphs breaking up a button row.
28
- ================================================================================
2
+ download_documentation: renders a release's documentation as one accordion item, entries with a description as sentences and the rest as buttons.
3
+ Schema: src/YAML/download_schema.yml
29
4
  {% endcomment %}
30
- {%- capture download_documentation_prose -%}
31
- {%- for row in include.documentation %}
32
- {%- assign has_description = false %}
5
+ {%- comment %} An entry with a description renders as prose, since a bare button reads as a call to action; prose and buttons stay in separate groups. {% endcomment %}
6
+ {%- assign download_documentation_prose = "" %}
7
+ {%- assign download_documentation_buttons = "" %}
8
+ {%- for row in include.documentation %}
9
+ {%- if row.title and row.title != "" %}
33
10
  {%- if row.description and row.description != "" %}
34
- {%- assign has_description = true %}
11
+ {%- capture download_documentation_prose %}{{ download_documentation_prose }}
12
+ <p class="mb-2">{%- include base/link.html.liquid name=row.title link=row.link target="_blank" icon="fa-solid fa-up-right-from-square" icon_position="end" %} {{ row.description }}</p>{% endcapture %}
13
+ {%- else %}
14
+ {%- capture download_documentation_buttons %}{{ download_documentation_buttons }}{%- include base/link.html.liquid class="btn focus-ring btn-outline-primary text-start" name=row.title link=row.link target="_blank" icon="fa-solid fa-up-right-from-square" icon_position="end" -%}{% endcapture %}
35
15
  {%- endif %}
36
- {%- if row.title and row.title != "" and has_description %}
37
- <p class="mb-2">{%- include base/link.html.liquid name=row.title link=row.link target="_blank" icon="fa-solid fa-up-right-from-square" icon_position="end" %} {{ row.description }}</p>
38
- {%- endif %}
39
- {%- endfor %}
40
- {%- endcapture -%}
41
- {%- capture download_documentation_buttons -%}
42
- {%- for row in include.documentation %}
43
- {%- assign has_description = false %}
44
- {%- if row.description and row.description != "" %}
45
- {%- assign has_description = true %}
46
- {%- endif %}
47
- {%- if row.title and row.title != "" and has_description == false %}
48
- {%- include base/link.html.liquid class="btn focus-ring btn-outline-primary text-start" role="button" name=row.title link=row.link target="_blank" icon="fa-solid fa-up-right-from-square" icon_position="end" -%}
49
- {%- endif %}
50
- {%- endfor %}
51
- {%- endcapture -%}
16
+ {%- endif %}
17
+ {%- endfor %}
52
18
  {%- assign download_documentation_prose_stripped = download_documentation_prose | strip %}
53
19
  {%- assign download_documentation_buttons_stripped = download_documentation_buttons | strip %}
54
20
  {%- capture download_documentation_body -%}
@@ -1,27 +1,17 @@
1
1
  {% comment %}
2
- ================================================================================
3
- Utility: Download End-of-life List
4
- Purpose: End-of-life milestones for one release, rendered as one collapsible
5
- item inside download_sections.html.liquid's shared documentation/commands/
6
- eol accordion — release-wide metadata that applies in common to every
7
- architecture above. Called from download_sections.html.liquid.
8
-
9
- Required Inputs:
10
- - eol: Array of {date, description}
11
- - accordion_id: Parent accordion's id, for data-bs-parent scoping
12
- - item_id: This item's unique collapse id
13
- - expanded: true starts this item open; false starts it closed. Passed
14
- through from the caller (see download_sections.html.liquid).
15
- ================================================================================
2
+ download_eol: renders a release's end-of-life milestones as one accordion item.
3
+ Schema: src/YAML/download_schema.yml
16
4
  {% endcomment %}
17
5
  {%- capture download_eol_body -%}
18
6
  <ul class="list-unstyled mb-0">
19
7
  {%- for row in include.eol %}
8
+ {%- comment %} The pinned Liquid has no remove_last, so split/join drops the trailing "</p>" markdownify adds. {% endcomment %}
9
+ {%- assign download_eol_description_html = row.description | markdownify | strip | remove_first: "<p>" | split: "</p>" | join: "</p>" | strip %}
20
10
  <li class="mb-1">
21
11
  {%- if row.date and row.date != "" -%}
22
12
  <strong>{{ row.date }}</strong>{% if row.description and row.description != "" %} — {% endif %}
23
13
  {%- endif -%}
24
- {{ row.description }}
14
+ {{ download_eol_description_html }}
25
15
  </li>
26
16
  {%- endfor %}
27
17
  </ul>
@@ -1,58 +1,16 @@
1
1
  {% comment %}
2
- ================================================================================
3
- Utility: Download File Value Row
4
- Purpose: One input-group row pairing a link-to-file icon with its copyable
5
- text value — the shared shape behind the checksum and signature rows in
6
- download_architecture.html.liquid's per-architecture box.
7
-
8
- A page using the copy button below must set `with_copyvalue: true` in its
9
- front matter — base/copyvalue.html.liquid (loaded globally from
10
- head.html.liquid, see src/JS/copyvalue.js for the copy-btn contract) is an
11
- opt-in include, not a global default, despite its own schema listing `true`
12
- as with_copyvalue's default (that default only covers with_copyvalue_data's
13
- sub-fields once the feature is already on).
14
-
15
- Required Inputs:
16
- - arch_name: Architecture label, used only in the input's aria-label
17
- (e.g. "Checksum value for x86_64").
18
- - field: The file's own URL (checksum/signature). Empty renders the
19
- left icon as a non-interactive glyph instead of a link.
20
- - field_value: The literal value to render/copy. Callers resolve their own
21
- `X_value | default: X` fallback before calling this include —
22
- this include renders field_value as-is.
23
- - icon: Font Awesome icon class for the left icon (e.g.
24
- "fa-solid fa-shield-halved").
25
- - label: Lowercase noun used in tooltip/aria-label text (e.g.
26
- "checksum", "signature").
27
- - id_prefix: Page-unique prefix (release id + architecture label, built by
28
- download_architecture.html.liquid) combined with `label` to
29
- give the `<input>` a unique id — every form field needs an id
30
- or name so the browser can autofill/target it correctly, and
31
- arch_name/label alone aren't page-unique (the same
32
- architecture repeats across every release/tab on the page).
33
-
34
- The clickable icon-link (when `field` is present) is rendered via
35
- base/link.html.liquid — the theme's canonical link component — rather than a
36
- hand-rolled `<a>`, so it inherits that component's javascript:/data:/vbscript:
37
- scheme neutralization and escaping. This also means, like the Download and
38
- Mirror buttons in download_architecture.html.liquid, it only renders when
39
- `page.with_link` is true; the non-interactive `<span>` fallback below covers
40
- both an empty `field` and a with_link-disabled page.
41
- ================================================================================
2
+ download_filevalue: renders an input group with a file link icon and a read-only value for one checksum or signature, plus a copy button when page.with_copyvalue is on.
3
+ Schema: src/YAML/download_schema.yml
42
4
  {% endcomment %}
43
5
  {%- assign download_filevalue_label_cap = include.label | capitalize -%}
44
6
  {%- assign download_filevalue_id = include.id_prefix | append: "-" | append: include.label -%}
45
7
  {%- assign download_filevalue_open_text = "Open " | append: include.label | append: " file" -%}
46
8
  <div class="input-group input-group-sm">
47
- {%- comment %} .link-primary is a Bootstrap utility, not a custom class —
48
- it reads as a clickable link instead of the plain body-color text
49
- .input-group-text renders by default, and compiles with `!important` so
50
- it wins over .input-group-text's color unconditionally, no custom SCSS or
51
- cascade ordering required. {% endcomment %}
52
- {%- if include.field and include.field != "" %}
9
+ {%- comment %} .link-primary compiles with !important, so it overrides the .input-group-text color without custom SCSS. {% endcomment %}
10
+ {%- comment %} base/link.html.liquid renders nothing unless page.with_link is true, so the span stands in for it then. {% endcomment %}
11
+ {%- if include.field and include.field != "" and page.with_link %}
53
12
  {%- include base/link.html.liquid
54
13
  class="input-group-text link-primary text-decoration-none"
55
- role="button"
56
14
  link=include.field
57
15
  icon=include.icon
58
16
  aria_label=download_filevalue_open_text
@@ -62,7 +20,9 @@ both an empty `field` and a with_link-disabled page.
62
20
  <span class="input-group-text"><i class="{{ include.icon }}"></i></span>
63
21
  {%- endif %}
64
22
  <input type="text" id="{{ download_filevalue_id }}" class="form-control font-monospace" readonly value="{{ include.field_value | escape }}" aria-label="{{ download_filevalue_label_cap }} value for {{ include.arch_name | escape }}">
65
- {%- comment %} data-copy-value MUST go through `| escape` — see
66
- base/copyvalue.html.liquid's own security note. {% endcomment %}
23
+ {%- comment %} Same gate as base/copyvalue.html.liquid: no copy script means no copy button. {% endcomment %}
24
+ {%- if page.with_copyvalue %}
25
+ {%- comment %} data-copy-value must go through escape: the browser decodes attribute entities before the script reads the value. {% endcomment %}
67
26
  <button type="button" class="input-group-text copy-btn focus-ring" data-copy-value="{{ include.field_value | escape }}" data-bs-toggle="tooltip" data-bs-title="Copy {{ include.label }} value" aria-label="Copy {{ include.label }} value"><span class="fa-regular fa-copy"></span></button>
27
+ {%- endif %}
68
28
  </div>
@@ -1,85 +1,30 @@
1
1
  {% comment %}
2
- ================================================================================
3
- Utility: Download Screenshots Carousel
4
- Purpose: Bootstrap carousel of screenshots for one release, rendered as one
5
- collapsible item inside download_sections.html.liquid's shared
6
- documentation/commands/eol/screenshots accordion — a sibling of Documentation
7
- and Migration, not nested inside either of them. Called from
8
- download_sections.html.liquid.
9
-
10
- Required Inputs:
11
- - screenshots: Array of {src, alt, title, description} — title/description
12
- are optional; when present they render as a Bootstrap carousel caption
13
- (https://getbootstrap.com/docs/5.3/components/carousel/#captions)
14
- overlaid on the slide, hidden below md so it doesn't crowd small screens.
15
- The caption heading is a `<div class="h5">`, not a real `<h5>` — same as
16
- the accordion-item headers' `<div class="accordion-header h2">` — because
17
- jekyll-toc auto-injects a "#" anchor into every real heading tag it scans,
18
- which an overlaid caption doesn't want.
19
- - image_base_path: Resolved base path under /assets/img/ (see
20
- download_schema.yml's image_base_path description)
21
- - release_id: Unique id of the parent tab-pane, used to scope carousel ids
22
- - accordion_id: Parent accordion's id, for data-bs-parent scoping
23
- - item_id: This item's unique collapse id
24
- - expanded: true starts this item open; false starts it closed. Passed
25
- through from the caller (see download_sections.html.liquid).
26
-
27
- Each slide is wrapped in Bootstrap's `.ratio` utility, set to a fixed 16:10
28
- box (`--bs-aspect-ratio: 62.5%` — 800 / 1280) so screenshots of any native
29
- size crop to a consistent box instead of each slide having its own height.
30
- 16:10 matches actual OS screenshot captures (e.g. 1280x800, a common
31
- display resolution) — deliberately not the 16:9 `ratio-16x9` modifier class
32
- artwork.html.liquid uses for its own image presentation
33
- (artwork_schema.yml's image_class default: `ratio ratio-16x9 rounded
34
- bg-dark bg-artwork`); real screen captures are rarely 16:9 natively, so
35
- matching artwork's ratio here would crop more than necessary. Bootstrap
36
- ships no `ratio-16x10` modifier class, hence the inline `--bs-aspect-ratio`
37
- override on the base `.ratio` class instead of a second modifier class.
38
- `object-fit-cover` on the `<img>` itself does the actual cropping — `.ratio`
39
- alone only stretches its child to fill the box.
40
-
41
- The carousel skips Bootstrap's `.carousel-dark` modifier: its indicator/
42
- caption colors are meant to react to whether the underlying image is
43
- generally light or dark, which fits calm banner photography but not real OS
44
- screenshots — a single release's slides span stark-white installer screens
45
- to busy desktop/app-grid content, no single color choice reads clearly
46
- against all of them. `.download-screenshots-carousel` (see
47
- src/SASS/_download.scss) instead gives the prev/next icons their own fixed
48
- dark scrim and the caption its own dark backdrop, so both stay legible over
49
- any screenshot regardless of image content.
50
-
51
- `.carousel-inner` and the two control buttons are wrapped in their own
52
- `.position-relative` div, separate from `.carousel-indicators` — Bootstrap's
53
- default markup puts indicators inside that same positioned box, overlaid on
54
- the image (`.carousel-indicators` is `position: absolute; bottom: 0`), which
55
- is illegible over screenshot content no scrim reliably fixes since a slide's
56
- content near the bottom edge varies per screenshot. Moving indicators
57
- outside the wrapper and resetting them to `position: static` in
58
- _download.scss instead renders them in normal flow below the image — plain
59
- dots on the page's own background, not an overlay — where they don't need a
60
- scrim at all. `.position-relative` also keeps the prev/next buttons
61
- (`top: 0; bottom: 0`, relative to the nearest positioned ancestor) scoped to
62
- the image's own height instead of stretching down to cover the indicator
63
- row too.
64
- ================================================================================
2
+ download_screenshots: renders a release's screenshots as a carousel inside one accordion item.
3
+ Schema: src/YAML/download_schema.yml
65
4
  {% endcomment %}
66
5
  {%- capture download_screenshots_body -%}
67
6
  <div class="p-3">
68
7
  <div id="carouselScreenshotsIndicators-{{ include.release_id }}" class="carousel slide download-screenshots-carousel" data-bs-ride="true">
8
+ {% comment %} Indicators sit outside .position-relative so they render below the image instead of over screenshot content. {% endcomment -%}
69
9
  <div class="position-relative">
70
10
  <div class="carousel-inner">
71
11
  {%- for row in include.screenshots %}
12
+ {%- comment %} The pinned Liquid has no remove_last, so split/join drops the trailing "</p>" markdownify adds. {% endcomment %}
13
+ {%- assign download_screenshot_title_html = row.title | markdownify | strip | remove_first: "<p>" | split: "</p>" | join: "</p>" | strip %}
14
+ {%- assign download_screenshot_description_html = row.description | markdownify | strip | remove_first: "<p>" | split: "</p>" | join: "</p>" | strip %}
72
15
  <div class="carousel-item{% if forloop.first %} active{% endif %}">
16
+ {% comment %} Bootstrap ships no 16:10 ratio class, so the screenshot aspect ratio is set inline. {% endcomment -%}
73
17
  <div class="ratio" style="--bs-aspect-ratio: 62.5%;">
74
18
  <img class="object-fit-cover" src="{{ site.baseurl }}{{ include.image_base_path }}{{ row.src | escape }}" alt="{{ row.alt | escape }}" />
75
19
  </div>
76
20
  {%- if row.title and row.title != "" or row.description and row.description != "" %}
77
21
  <div class="carousel-caption d-none d-md-block">
78
22
  {%- if row.title and row.title != "" %}
79
- <div class="h5">{{ row.title }}</div>
23
+ {% comment %} A div.h5, not an h5, keeps jekyll-toc from adding an anchor to the caption. {% endcomment -%}
24
+ <div class="h5">{{ download_screenshot_title_html }}</div>
80
25
  {%- endif %}
81
26
  {%- if row.description and row.description != "" %}
82
- <p>{{ row.description }}</p>
27
+ <p>{{ download_screenshot_description_html }}</p>
83
28
  {%- endif %}
84
29
  </div>
85
30
  {%- endif %}
@@ -1,23 +1,6 @@
1
1
  {% comment %}
2
- ================================================================================
3
- Utility: Download Release Sections
4
- Purpose: Renders one release's architecture/documentation/eol/commands/
5
- screenshots sections, in a fixed order, each only if its data is present.
6
- Shared by download.html.liquid's tabbed (multiple releases) and untabbed
7
- (single release) render paths, since the section content is identical either
8
- way — only the surrounding tab markup differs. Documentation, commands, eol,
9
- and screenshots render as sibling items inside one shared Bootstrap accordion
10
- below the architecture grid — collapsible, so they read as release-wide
11
- metadata that applies in common to every architecture above rather than
12
- disconnected trailing content. All start collapsed.
13
-
14
- Required Inputs:
15
- - release_data: One release's content object
16
- - release_id: Unique id for this release, used to scope nested element ids
17
- (the documentation/commands/eol/screenshots accordion, the screenshots
18
- carousel's own ids)
19
- - image_base_path: Resolved base path under /assets/img/
20
- ================================================================================
2
+ download_sections: renders a release's architecture grid, then its screenshots, documentation, commands, and end-of-life items in one accordion.
3
+ Schema: src/YAML/download_schema.yml
21
4
  {% endcomment %}
22
5
 
23
6
  {%- if include.release_data.architecture.size > 0 %}
@@ -1,39 +1,7 @@
1
1
  {% comment %}
2
- ================================================================================
3
- Template: Event Alerts Component
4
- Purpose: Renders event announcements as styled alert boxes with date, location,
5
- description, and optional action links.
6
- ================================================================================
7
-
8
- Design Logic:
9
- - Alert-based styling: consistent with Bootstrap alert components
10
- - Icon support: visual identification of event type
11
- - Color coding: color-based categorization
12
- - Location details: address and city information optional
13
- - Date/time display: with location suffix if available
14
- - Optional action link: "Know more" button for details page
15
- - Multi-event support: loops through event array
16
-
17
- Required Inputs:
18
- - title: Event name/title
19
- - 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)
21
-
22
- Optional Inputs:
23
- - description: Event description text
24
- - end: Event inclusive end (same format as start), defaults to start
25
- - location: Event location name
26
- - color: Alert color scheme (default: "secondary")
27
- - icon: Icon class (default: "fa-solid fa-calendar")
28
- - link: URL to event details page (optional)
29
- - data: Array of event objects
30
-
31
- Data Source Hierarchy (priority):
32
- 1. include.data
33
- 2. page.with_event_data
34
- 3. site.data.event
35
- 4. site.data.base.event
36
- ================================================================================
2
+ event: renders each event as an alert with its title, formatted date, location, description, and an optional "Know more" button.
3
+ Data: include.data > page.with_event_data > site.data.event > site.data.base.event
4
+ Schema: src/YAML/event_schema.yml
37
5
  {% endcomment %}
38
6
 
39
7
  {%- assign with_event = include.with_event
@@ -49,38 +17,19 @@ Data Source Hierarchy (priority):
49
17
  {%- if with_event %}
50
18
 
51
19
  {%- assign with_event_schema = site.data.base.event_schema.properties.with_event_data.items.properties %}
52
-
53
- {%- comment %} === Presentation === {% endcomment %}
54
20
  {%- if with_event_data.size > 0 %}
55
21
  <div class="mb-3">
56
22
  {%- for event in with_event_data %}
57
- {%- comment %} --- Defaults --- {% endcomment %}
58
- {%- assign event_address = event.address | default: with_event_schema.address.default %}
59
- {%- assign event_city = event.city | default: with_event_schema.city.default %}
60
23
  {%- assign event_color = event.color | default: with_event_schema.color.default %}
61
24
  {%- assign event_location = event.location | default: with_event_schema.location.default %}
62
25
  {%- assign event_description = event.description | default: with_event_schema.description.default %}
26
+ {%- comment %} The pinned Liquid has no remove_last, so split/join drops the trailing "</p>" markdownify adds. {% endcomment %}
27
+ {%- assign event_description_html = event_description | markdownify | strip | remove_first: "<p>" | split: "</p>" | join: "</p>" | strip %}
63
28
 
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 %}
29
+ {%- comment %} Formats start and end into one display string, collapsing a shared month or year; a start with a time (T) is a same-day timed event. {% endcomment %}
78
30
  {%- assign event_start = event.start %}
79
- {%- if event_start != "" and event_start != nil %}
31
+ {%- if event_start and event_start != "" %}
80
32
  {%- assign event_end = event.end | default: event_start %}
81
- {%- if event_end == "" %}
82
- {%- assign event_end = event_start %}
83
- {%- endif %}
84
33
  {%- if event_start contains "T" %}
85
34
  {%- assign event_date = event_start | date: "%B %-d, %Y" %}
86
35
  {%- assign event_start_time = event_start | date: "%-l:%M %p" %}
@@ -115,13 +64,10 @@ Data Source Hierarchy (priority):
115
64
  {%- assign event_date = "" %}
116
65
  {%- endif %}
117
66
  {%- assign event_icon = event.icon | default: with_event_schema.icon.default %}
118
- {%- assign event_image_url = event.image_url | default: with_event_schema.image_url.default %}
119
67
  {%- assign event_link = event.link | default: with_event_schema.link.default %}
120
68
  {%- assign event_title = event.title | default: with_event_schema.title.default %}
121
69
 
122
70
  {%- assign event_btn_class = "btn btn-sm text-nowrap btn-" | append: event_color %}
123
-
124
- {%- comment %} --- HTML --- {% endcomment %}
125
71
  <div class="alert alert-{{ event_color }} rounded mb-1" role="alert">
126
72
  <div class="d-flex justify-content-between align-items-start">
127
73
  {%- if event_icon != "" %}
@@ -135,7 +81,7 @@ Data Source Hierarchy (priority):
135
81
  <p class="ms-1 mb-0">{{ event_date }}{% if event_location != "" %} • {{ event_location }}{%- endif %}</p>
136
82
  {%- endif %}
137
83
  {%- if event_description != "" %}
138
- <p class="ms-1 mb-0">{{ event_description }}</p>
84
+ <p class="ms-1 mb-0">{{ event_description_html }}</p>
139
85
  {%- endif %}
140
86
  </div>
141
87
  {%- if event_link != "" %}
@@ -144,7 +90,6 @@ Data Source Hierarchy (priority):
144
90
  name = "Know more"
145
91
  icon = "fa-solid fa-arrow-right"
146
92
  icon_position = "end"
147
- role = "button"
148
93
  class = event_btn_class
149
94
  color = event_color
150
95
  link = event_link
@@ -1,35 +1,7 @@
1
1
  {% comment %}
2
- ================================================================================
3
- Template: Font Awesome Icon Library Component
4
- Purpose: Loads Font Awesome icon library CSS and JavaScript from CDN
5
- with integrity checks.
6
- ================================================================================
7
-
8
- Design Logic:
9
- - CDN-based library loading with SRI integrity verification
10
- - Two loading modes: svg+js (default) and css
11
- - svg+js: JavaScript bundle replaces <i> tags with inline SVGs via DOM mutation;
12
- enables power transforms, layering, pseudo-element watching
13
- - css: stylesheet + WOFF2 font files loaded on demand; lighter payload, no DOM cost
14
- - Format switching: separate head (CSS link) and script (JS) includes; preload hints mode-aware
15
- - Subresource Integrity (SRI): ensures file hasn't been tampered with
16
- - Privacy-focused: referrerpolicy="no-referrer"
17
-
18
- Optional Inputs:
19
- - type: "preload" for resource hint, "head" for CSS link, "script" for JavaScript
20
- - mode: "svg+js" (default) or "css" — controls which assets are emitted per type
21
- - version: Font Awesome version (e.g., "7.0.1")
22
- - cdn: CDN base URL (default: cdnjs.cloudflare.com)
23
- - css_bundle_name, js_bundle_name: Bundle identifiers
24
- - css_bundle_integrity, js_bundle_integrity: SRI hashes
25
- - data: Font Awesome configuration object
26
-
27
- Data Source Hierarchy (priority):
28
- 1. include.data
29
- 2. page.with_fontawesome_data
30
- 3. site.data.fontawesome
31
- 4. site.data.base.fontawesome
32
- ================================================================================
2
+ fontawesome: loads Font Awesome from the CDN in css or svg+js mode. head.html.liquid calls it with type="preload", type="head", and type="script".
3
+ Data: include.data > page.with_fontawesome_data > site.data.fontawesome > site.data.base.fontawesome
4
+ Schema: src/YAML/fontawesome_schema.yml
33
5
  {% endcomment %}
34
6
 
35
7
  {%- assign with_fontawesome = include.with_fontawesome
@@ -45,17 +17,13 @@ Data Source Hierarchy (priority):
45
17
  {%- assign with_fontawesome_schema = site.data.base.fontawesome_schema.properties.with_fontawesome_data.properties %}
46
18
 
47
19
  {%- if with_fontawesome %}
48
-
49
- {%- comment %} === Presentation === {% endcomment %}
50
-
51
- {%- comment %} --- Defaults --- {% endcomment %}
52
20
  {%- assign fontawesome_version = with_fontawesome_data.version | default: with_fontawesome_schema.version.default %}
53
21
  {%- assign fontawesome_cdn = with_fontawesome_data.cdn | default: with_fontawesome_schema.cdn.default %}
54
22
  {%- assign fontawesome_css_bundle_name = with_fontawesome_data.css_bundle_name | default: with_fontawesome_schema.css_bundle_name.default %}
55
23
  {%- assign fontawesome_css_bundle_integrity = with_fontawesome_data.css_bundle_integrity | default: with_fontawesome_schema.css_bundle_integrity.default %}
56
24
  {%- assign fontawesome_js_bundle_name = with_fontawesome_data.js_bundle_name | default: with_fontawesome_schema.js_bundle_name.default %}
57
25
  {%- assign fontawesome_js_bundle_integrity = with_fontawesome_data.js_bundle_integrity | default: with_fontawesome_schema.js_bundle_integrity.default %}
58
- {%- assign fontawesome_mode = with_fontawesome_data.mode | default: with_fontawesome_schema.mode.default | default: "svg+js" %}
26
+ {%- assign fontawesome_mode = with_fontawesome_data.mode | default: with_fontawesome_schema.mode.default %}
59
27
 
60
28
  {%- capture html_fontawesome_preload %}
61
29
  {%- if fontawesome_mode == "css" %}
@@ -76,8 +44,6 @@ Data Source Hierarchy (priority):
76
44
  <script src="{{ fontawesome_cdn }}/{{ fontawesome_version }}/js/{{ fontawesome_js_bundle_name }}.min.js" integrity="{{ fontawesome_js_bundle_integrity }}" crossorigin="anonymous" referrerpolicy="no-referrer" defer></script>
77
45
  {%- endif %}
78
46
  {%- endcapture %}
79
-
80
- {%- comment %} --- HTML --- {% endcomment %}
81
47
  {%- assign type = include.type %}
82
48
  {%- case type %}
83
49
  {%- when "preload" %}
@@ -1,3 +1,8 @@
1
+ {% comment %}
2
+ footer: renders the site footer with the brand, site description, sponsors carousel, shortcuts, locales, social links, and copyright.
3
+ Data: include.data > page.with_footer_data > site.data.footer > site.data.base.footer
4
+ Schema: src/YAML/footer_schema.yml
5
+ {% endcomment %}
1
6
  {%- assign with_footer = include.with_footer
2
7
  | default: page.with_footer
3
8
  %}
@@ -19,9 +24,11 @@
19
24
  {%- assign footer_brand_manifestation = with_footer_data.brand_manifestation | default: with_footer_schema.brand_manifestation.default %}
20
25
  {%- assign footer_brand_manifestation_class = with_footer_data.brand_manifestation_class | default: with_footer_schema.brand_manifestation_class.default %}
21
26
 
22
- <footer class="{{ footer_class }}">
27
+ {%- comment %} Dark color mode gives links colors that stay readable on the dark footer background. {% endcomment %}
28
+ <footer class="{{ footer_class }}" data-bs-theme="dark">
23
29
 
24
- <div class="container">
30
+ {%- comment %} overflow-hidden: gx-5 widens the row's negative margin past the container's padding, which scrolls the page sideways on phones. {% endcomment %}
31
+ <div class="container overflow-hidden">
25
32
  <div class="row justify-content-between align-items-start gx-5">
26
33
  <div class="col-sm-12 col-lg-4">
27
34
  {%- if footer_brand_image != "" %}
@@ -1,41 +1,6 @@
1
1
  {% comment %}
2
- ================================================================================
3
- Template: Page Head Section Component
4
- Purpose: Generates complete HTML <head> section with meta tags, stylesheets,
5
- icons, fonts, and conditional library includes.
6
- ================================================================================
7
-
8
- Design Logic:
9
- - Comprehensive meta tags: charset, viewport, referrer policy, description, theme-color
10
- - Dynamic title generation: page title + site title
11
- - Favicon support: multiple formats (16x16, 32x32, SVG with type, Apple Touch)
12
- - Google Fonts: Montserrat (5 weights) and Source Code Pro (2 weights) via async stylesheet
13
- - Breakingnews scroll offset: dynamic CSS calculation
14
- - Conditional includes: OGP, Highlight.js, DataTables, FontAwesome (SVG+JS), Event Calendar
15
- - CSS load order: theme stylesheet loads first, then per-component vendor
16
- CSS (FontAwesome, DataTables, Event Calendar). Components whose vendor CSS
17
- needs correcting win with higher-specificity selectors in their own SCSS
18
- partial instead of load order — see _datatable.scss and _calendar.scss.
19
- - Script loading: Bootstrap base first (defer), then optional extensions, then UI behaviors
20
- - Bootstrap and FontAwesome preloaded (high-priority fetch); CDN origins preconnected + dns-prefetched per active component
21
-
22
- Required Inputs:
23
- - page.title: Current page title
24
- - site.title: Site name/title
25
- - site.baseurl: Base URL for asset paths
26
-
27
- Optional Inputs:
28
- - page.with_ogp, page.with_fontawesome: Include OGP/Font Awesome SVG+JS (boolean)
29
- - page.with_breakingnews, page.with_highlight: Include breaking news/highlight
30
- - page.with_datatable: Include DataTables (boolean)
31
- - page.with_calendar: Include Event Calendar (boolean)
32
- - page.with_breakingnews_data: Array of breaking news items
33
- - page.with_backtotop: Include back-to-top button (boolean)
34
- - page.with_copyvalue: Include copy-to-clipboard behavior (boolean)
35
- - page.theme_color, site.theme_color: Override browser chrome color. The
36
- fallback below is a literal, not read from head_schema.yml — keep both in
37
- sync if the default ever changes.
38
- ================================================================================
2
+ head: renders the head element with meta tags, icons, fonts, the theme stylesheet, Bootstrap, and each enabled library's CSS and JS.
3
+ Schema: src/YAML/head_schema.yml
39
4
  {% endcomment %}
40
5
 
41
6
  <head>
@@ -47,14 +12,14 @@ Optional Inputs:
47
12
  {% else -%}
48
13
  <title>{{ page.title | escape }} - {{ site.title | escape }}</title>
49
14
  {% endif -%}
50
- <meta name="description" content="{{ page.description | default: page.excerpt | default: page.title_lead | default: site.description | strip_html | truncate: 160 | escape }}" />
15
+ <meta name="description" content="{{ page.description | default: page.excerpt | default: page.title_lead | default: site.description | markdownify | strip_html | strip_newlines | strip | truncate: 160 | escape_once }}" />
51
16
  {% include base/ogp.html.liquid %}
52
17
  <link rel="icon" href="{{ site.baseurl }}/assets/icons/favicon-16.png" sizes="16x16" />
53
18
  <link rel="icon" href="{{ site.baseurl }}/assets/icons/favicon-32.png" sizes="32x32" />
54
19
  <link rel="icon" href="{{ site.baseurl }}/assets/icons/favicon.svg" type="image/svg+xml" sizes="any" />
55
20
  <link rel="apple-touch-icon" href="{{ site.baseurl }}/assets/icons/apple-touch-icon.png" sizes="180x180" />
56
21
  <link rel="manifest" href="{{ site.baseurl }}/site.webmanifest" />
57
- {%- assign head_theme_color = page.theme_color | default: site.theme_color | default: '#A54C93' %}
22
+ {%- assign head_theme_color = page.theme_color | default: site.theme_color | default: site.data.base.head_schema.properties.theme_color.default %}
58
23
  <meta name="theme-color" content="{{ head_theme_color }}" />
59
24
  <link rel="preconnect" href="https://fonts.googleapis.com" />
60
25
  <link rel="dns-prefetch" href="https://fonts.googleapis.com" />
@@ -81,9 +46,7 @@ Optional Inputs:
81
46
  <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'" />
82
47
  <noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Montserrat:wght@300;400;500;600;700&family=Source+Code+Pro:ital,wght@0,400;0,700&display=swap" /></noscript>
83
48
  <link rel="stylesheet" href="{{ site.baseurl }}/assets/css/base/stylesheet.min.css" />
84
- {%- comment %} Sets scroll-margin-top via CSS custom properties, sized to
85
- the current number of breaking news items, so anchor links land below the
86
- breaking news bar (and navbar, if present) instead of under it. {%- endcomment %}
49
+ {%- comment %} Sets scroll-margin-top so anchor links land below the breaking news bar and navbar instead of under them. {%- endcomment %}
87
50
  {%- assign breakingnews = page.with_breakingnews_data | default: site.data.breakingnews | default: site.data.base.breakingnews %}
88
51
  {%- if page.with_breakingnews == true and breakingnews.size > 0 %}
89
52
  {%- assign breakingnews_alert_height = site.data.base.breakingnews_schema.properties.breakingnews_alert_height.default %}
@@ -123,8 +86,6 @@ breaking news bar (and navbar, if present) instead of under it. {%- endcomment %
123
86
  }
124
87
  </style>
125
88
  {%- endif %}
126
-
127
- {%- comment %} CSS dependencies {%- endcomment %}
128
89
  {%- include base/fontawesome.html.liquid type="head" %}
129
90
  {%- include base/datatable.html.liquid type="head" %}
130
91
  {%- include base/calendar.html.liquid type="head" %}
@@ -132,14 +93,12 @@ breaking news bar (and navbar, if present) instead of under it. {%- endcomment %
132
93
  {%- comment %} JavaScript base — Bootstrap must execute before all component scripts {%- endcomment %}
133
94
  <script src="{{ site.baseurl }}/assets/js/bootstrap.bundle.min.js" defer></script>
134
95
  <script src="{{ site.baseurl }}/assets/js/base/init-tooltips.min.js" defer></script>
135
-
136
- {%- comment %} JavaScript optional library extensions {%- endcomment %}
137
96
  {%- include base/fontawesome.html.liquid type="script" %}
138
97
  {%- include base/highlight.html.liquid %}
139
98
  {%- include base/datatable.html.liquid type="script" %}
140
99
  {%- include base/calendar.html.liquid type="script" %}
141
100
 
142
- {%- comment %} JavaScript UI behavior components — depend on Bootstrap and FontAwesome SVG+JS {%- endcomment %}
101
+ {%- comment %} UI behavior scripts depend on Bootstrap, so they load after it. {%- endcomment %}
143
102
  {%- include base/backtotop.html.liquid %}
144
103
  {%- include base/copyvalue.html.liquid %}
145
104
  </head>