jekyll-theme-centos 2.52.0.beta.52 → 2.52.0.beta.54

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 (75) hide show
  1. checksums.yaml +4 -4
  2. data/_data/base/bits_schema.yml +5 -4
  3. data/_data/base/heading_anchor.yml +4 -0
  4. data/_data/base/heading_anchor_schema.yml +37 -0
  5. data/_data/base/link_schema.yml +101 -67
  6. data/_data/base/locales_schema.yml +1 -1
  7. data/_data/base/{content_schema.yml → partials/content_schema.yml} +1 -1
  8. data/_data/base/partials/footer.yml +9 -0
  9. data/_data/base/partials/footer_schema.yml +55 -0
  10. data/_data/base/project_schema.yml +8 -4
  11. data/_data/base/title_schema.yml +1 -1
  12. data/_data/base/toc_schema.yml +16 -2
  13. data/_includes/base/announcement.html.liquid +19 -7
  14. data/_includes/base/artwork.html.liquid +18 -6
  15. data/_includes/base/backtotop.html.liquid +20 -6
  16. data/_includes/base/bits.html.liquid +31 -18
  17. data/_includes/base/breadcrumb.html.liquid +7 -1
  18. data/_includes/base/breakingnews.html.liquid +19 -7
  19. data/_includes/base/card.html.liquid +43 -29
  20. data/_includes/base/configuration-variables-nested.html.liquid +1 -1
  21. data/_includes/base/configuration-variables.html.liquid +3 -3
  22. data/_includes/base/copyright.html.liquid +18 -6
  23. data/_includes/base/copyvalue.html.liquid +19 -5
  24. data/_includes/base/datatable.html.liquid +20 -6
  25. data/_includes/base/event.html.liquid +33 -21
  26. data/_includes/base/fontawesome.html.liquid +21 -7
  27. data/_includes/base/heading_anchor.html.liquid +62 -0
  28. data/_includes/base/highlight.html.liquid +19 -5
  29. data/_includes/base/link.html.liquid +47 -53
  30. data/_includes/base/locales.html.liquid +41 -30
  31. data/_includes/base/navindex.html.liquid +14 -2
  32. data/_includes/base/ogp.html.liquid +89 -75
  33. data/_includes/base/partials/footer.html.liquid +69 -0
  34. data/_includes/base/partials/head.html.liquid +93 -0
  35. data/_includes/base/{navbar.html.liquid → partials/navbar.html.liquid} +22 -12
  36. data/_includes/base/{script.html.liquid → partials/script.html.liquid} +7 -19
  37. data/_includes/base/project.html.liquid +34 -22
  38. data/_includes/base/shortcut.html.liquid +32 -24
  39. data/_includes/base/social.html.liquid +33 -23
  40. data/_includes/base/sponsors-cards.html.liquid +17 -6
  41. data/_includes/base/sponsors-carousel.html.liquid +21 -8
  42. data/_includes/base/title.html.liquid +21 -10
  43. data/_includes/base/toc.html.liquid +2 -2
  44. data/_layouts/base/default.html +8 -8
  45. data/_sass/base/_customization.scss +47 -0
  46. data/assets/img/base/page-layout-default.png +0 -0
  47. data/assets/img/base/page-layout-default.svg +878 -1241
  48. data/assets/img/base/page-with-backtotop.png +0 -0
  49. data/assets/img/base/page-with-backtotop.svg +800 -573
  50. data/assets/img/base/page-with-copyright.png +0 -0
  51. data/assets/img/base/page-with-copyright.svg +818 -645
  52. data/assets/img/base/page-with-footer.png +0 -0
  53. data/assets/img/base/page-with-footer.svg +1018 -0
  54. data/assets/img/base/page-with-link.png +0 -0
  55. data/assets/img/base/page-with-link.svg +142 -139
  56. data/assets/img/base/page-with-locales.png +0 -0
  57. data/assets/img/base/page-with-locales.svg +795 -577
  58. data/assets/img/base/page-with-shortcut.png +0 -0
  59. data/assets/img/base/page-with-shortcut.svg +796 -569
  60. data/assets/img/base/page-with-social.png +0 -0
  61. data/assets/img/base/page-with-social.svg +811 -673
  62. data/assets/img/base/page-with-sponsors.png +0 -0
  63. data/assets/img/base/page-with-sponsors.svg +795 -568
  64. data/assets/js/base/heading-anchor.js +108 -0
  65. data/assets/js/base/init-tooltips.js +5 -4
  66. metadata +20 -13
  67. data/_data/base/toc_generator_schema.yml +0 -102
  68. data/_includes/base/footer.html.liquid +0 -62
  69. data/_includes/base/head.html.liquid +0 -101
  70. /data/_data/base/{content.yml → partials/content.yml} +0 -0
  71. /data/_data/base/{head_schema.yml → partials/head_schema.yml} +0 -0
  72. /data/_data/base/{navbar.yml → partials/navbar.yml} +0 -0
  73. /data/_data/base/{navbar_schema.yml → partials/navbar_schema.yml} +0 -0
  74. /data/_data/base/{script_schema.yml → partials/script_schema.yml} +0 -0
  75. /data/_includes/base/{toc_generator.html.liquid → toc-generator.html.liquid} +0 -0
@@ -0,0 +1,93 @@
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, responsive design
10
+ - Dynamic title generation: page title + site title
11
+ - Favicon support: multiple formats (16x16, 32x32, SVG, Apple Touch)
12
+ - Google Fonts: Montserrat and Source Code Pro preloaded
13
+ - Breakingnews scroll offset: dynamic CSS calculation
14
+ - Conditional includes: OGP, Font Awesome, Highlight.js, DataTables
15
+ - CSS prioritization: custom stylesheet last for override
16
+
17
+ Required Inputs:
18
+ - page.title: Current page title
19
+ - site.title: Site name/title
20
+ - site.baseurl: Base URL for asset paths
21
+
22
+ Optional Inputs:
23
+ - page.with_ogp, page.with_fontawesome: Include OGP/Font Awesome (boolean)
24
+ - page.with_breakingnews, page.with_highlight: Include breaking news/highlight
25
+ - page.with_datatable: Include DataTables (boolean)
26
+ - page.with_breakingnews_data: Array of breaking news items
27
+ ================================================================================
28
+ {% endcomment %}
29
+
30
+ <head>
31
+ {% if page.title == site.title -%}
32
+ <title>{{ page.title }}</title>
33
+ {% else -%}
34
+ <title>{{ page.title }} - {{ site.title }}</title>
35
+ {% endif -%}
36
+ <meta charset="utf-8" />
37
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no" />
38
+ {% include base/ogp.html.liquid %}
39
+ <link rel="icon" href="{{ site.baseurl }}/assets/icons/favicon-16.png" sizes="16x16" />
40
+ <link rel="icon" href="{{ site.baseurl }}/assets/icons/favicon-32.png" sizes="32x32" />
41
+ <link rel="icon" href="{{ site.baseurl }}/assets/icons/favicon.svg" sizes="any" />
42
+ <link rel="apple-touch-icon" href="{{ site.baseurl }}/assets/icons/apple-touch-icon.png" sizes="180x180" />
43
+ <link rel="manifest" href="{{ site.baseurl }}/site.webmanifest" />
44
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
45
+ <link rel="preconnect" href="https://fonts.googleapis.com" />
46
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Montserrat:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&family=Source+Code+Pro:ital,wght@0,400;0,500;0,700;1,400;1,500;1,700&display=swap" />
47
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Source+Code+Pro:ital,wght@0,400;0,500;0,700;1,400;1,500;1,700&display=swap" />
48
+ <link rel="stylesheet" href="{{ site.baseurl }}/assets/css/base/stylesheet.min.css" />
49
+ {%- comment %}
50
+ Dynamic Breaking News Offset CSS
51
+ Adjust scroll-margin-top values based on the number of breaking news items.
52
+ Uses CSS custom properties for cleaner, more maintainable dynamic styling.
53
+ {%- endcomment %}
54
+ {%- assign breakingnews = page.with_breakingnews_data | default: site.data.breakingnews | default: site.data.base.breakingnews %}
55
+ {%- if page.with_breakingnews == true and breakingnews.size > 0 %}
56
+ {%- assign breakingnews_alert_height = 31 %}
57
+ {%- assign navbar_height = 42 %}
58
+ {%- assign breakingnews_offset = 0 %}
59
+ {%- for item in breakingnews %}
60
+ {%- if forloop.first %}
61
+ {%- assign breakingnews_offset = breakingnews_alert_height | plus: navbar_height %}
62
+ {%- else %}
63
+ {%- assign breakingnews_offset = breakingnews_offset | plus: breakingnews_alert_height %}
64
+ {%- endif %}
65
+ {%- endfor %}
66
+ {%- assign heading_margin_px = 48 %}
67
+ {%- assign heading_scroll_margin_height = breakingnews_offset | plus: heading_margin_px %}
68
+ {%- assign accordion_scroll_margin_height = breakingnews_offset %}
69
+ <style>
70
+ :root {
71
+ --calculated-heading-offset: {{ heading_scroll_margin_height }}px;
72
+ --calculated-accordion-offset: {{ accordion_scroll_margin_height }}px;
73
+ }
74
+ main {
75
+ .content > h1,
76
+ .content > h2,
77
+ .content > h3,
78
+ .content > h4,
79
+ .content > h5,
80
+ .content > h6 {
81
+ scroll-margin-top: calc(var(--calculated-heading-offset) * 1.3) !important;
82
+ }
83
+ .content .accordion,
84
+ .content .accordion-item {
85
+ scroll-margin-top: calc(var(--calculated-accordion-offset) * 1.5) !important;
86
+ }
87
+ }
88
+ </style>
89
+ {%- endif %}
90
+ {% include base/fontawesome.html.liquid type="head" %}
91
+ {% include base/highlight.html.liquid type="head" %}
92
+ {% include base/datatable.html.liquid type="head" %}
93
+ </head>
@@ -26,21 +26,31 @@ Data Source Hierarchy (priority):
26
26
  1. include.data
27
27
  2. page.with_navbar_data
28
28
  3. site.data.navbar
29
- 4. site.data.base.navbar
29
+ 4. site.data.base.partials.navbar
30
30
  ================================================================================
31
31
  {% endcomment %}
32
32
 
33
- {%- if page.with_navbar -%}
34
- {%- assign navbar = include.data | default: page.with_navbar_data | default: site.data.navbar | default: site.data.base.navbar %}
35
- {%- assign schema = site.data.base.navbar_schema.properties["with_navbar_data"].properties %}
36
-
37
- {%- assign navbar_class = navbar.class | default: schema.class.default %}
38
- {%- assign navbar_brand_image = navbar.brand_image | default: schema.brand_image.default %}
39
- {%- assign navbar_brand_image_class = navbar.brand_image_class | default: schema.brand_image_class.default %}
40
- {%- assign navbar_brand_image_height = navbar.brand_image_height | default: schema.brand_image_height.default %}
41
- {%- assign navbar_brand_manifestation = navbar.brand_manifestation | default: schema.brand_manifestation.default %}
42
- {%- assign navbar_brand_manifestation_class = navbar.brand_manifestation_class | default: schema.brand_manifestation_class.default %}
43
- {%- assign navbar_navitems = navbar.navitems | where: "visible_on", "navbar" | default: schema.navitems.default %}
33
+ {%- assign with_navbar = include.with_navbar
34
+ | default: page.with_navbar
35
+ %}
36
+
37
+ {%- assign with_navbar_data = include.data
38
+ | default: page.with_navbar_data
39
+ | default: site.data.navbar
40
+ | default: site.data.base.partials.navbar
41
+ %}
42
+
43
+ {%- assign with_navbar_schema = site.data.base.partials.navbar_schema.properties.with_navbar_data.properties %}
44
+
45
+ {%- if with_navbar %}
46
+
47
+ {%- assign navbar_class = with_navbar_data.class | default: with_navbar_schema.class.default %}
48
+ {%- assign navbar_brand_image = with_navbar_data.brand_image | default: with_navbar_schema.brand_image.default %}
49
+ {%- assign navbar_brand_image_class = with_navbar_data.brand_image_class | default: with_navbar_schema.brand_image_class.default %}
50
+ {%- assign navbar_brand_image_height = with_navbar_data.brand_image_height | default: with_navbar_schema.brand_image_height.default %}
51
+ {%- assign navbar_brand_manifestation = with_navbar_data.brand_manifestation | default: with_navbar_schema.brand_manifestation.default %}
52
+ {%- assign navbar_brand_manifestation_class = with_navbar_data.brand_manifestation_class | default: with_navbar_schema.brand_manifestation_class.default %}
53
+ {%- assign navbar_navitems = with_navbar_data.navitems | where: "visible_on", "navbar" | default: with_navbar_schema.navitems.default %}
44
54
 
45
55
  <nav class="navbar bg-dark fixed-top navbar-expand-lg shadow{% if navbar_class != "" %} {{ navbar_class }}{% endif %}" aria-label="{{ include.arialable | default: 'navbar'}}" data-bs-theme="dark">
46
56
  <div class="container">
@@ -22,6 +22,7 @@ Conditional Inputs (from page front matter):
22
22
  - page.with_datatable: Load DataTables (boolean)
23
23
  - page.with_backtotop: Load Back-to-Top (boolean)
24
24
  - page.with_copyvalue: Load Copy Value functionality (boolean)
25
+ - page.with_heading_anchor: Load Heading Anchor copy behavior (boolean)
25
26
 
26
27
  Bootstrap Tooltip Initialization:
27
28
  ```javascript
@@ -38,22 +39,9 @@ Dependencies:
38
39
  <script src="{{ site.baseurl }}/assets/js/bootstrap.bundle.min.js"></script>
39
40
  <script src="{{ site.baseurl }}/assets/js/base/init-tooltips.min.js"></script>
40
41
 
41
- {% if page.with_fontawesome -%}
42
- {% include base/fontawesome.html.liquid type="script" %}
43
- {% endif %}
44
-
45
- {% if page.with_highlight %}
46
- {% include base/highlight.html.liquid type="script" %}
47
- {% endif -%}
48
-
49
- {% if page.with_datatable %}
50
- {% include base/datatable.html.liquid type="script" %}
51
- {% endif %}
52
-
53
- {% if page.with_backtotop -%}
54
- {% include base/backtotop.html.liquid %}
55
- {% endif %}
56
-
57
- {% if page.with_copyvalue -%}
58
- {% include base/copyvalue.html.liquid %}
59
- {% endif %}
42
+ {%- include base/fontawesome.html.liquid type="script" %}
43
+ {%- include base/highlight.html.liquid type="script" %}
44
+ {%- include base/datatable.html.liquid type="script" %}
45
+ {%- include base/backtotop.html.liquid %}
46
+ {%- include base/copyvalue.html.liquid %}
47
+ {%- include base/heading_anchor.html.liquid %}
@@ -27,29 +27,40 @@ Data Source Hierarchy (priority):
27
27
  ================================================================================
28
28
  {% endcomment %}
29
29
 
30
- {%- if page.with_project -%}
31
- {%- assign project = include.data | default: page.with_project_data | default: site.data.project | default: site.data.base.project %}
30
+ {%- assign with_project = include.with_project
31
+ | default: page.with_project
32
+ %}
32
33
 
33
- {% assign project_class = project.class | default: "flex-column text-bg-dark bg-image" %}
34
- {% assign project_screenshot = project.screenshot | default: nil %}
35
- {% assign project_screenshot_class = project.screenshot_class | default: nil %}
36
- {% assign project_screenshot_alt = project.screenshot_alt | default: nil %}
37
- {% assign project_image = project.image | default: nil %}
38
- {% assign project_image_alt = project.image_alt | default: nil %}
39
- {% assign project_image_class = project.image_class | default: "img-fluid mb-3" %}
40
- {% assign project_image_style = project.image_style | default: nil %}
41
- {% assign project_icon = project.icon | default: nil %}
42
- {% assign project_icon_class = project.icon_class | default: "display-3 fw-bold mb-1" %}
43
- {% assign project_name = project.name | default: nil %}
44
- {% assign project_name_class = project.name_class | default: "display-3 fw-bold mb-1" %}
45
- {% assign project_description = project.description | default: nil %}
46
- {% assign project_description_class = project.description_class | default: "lead mb-3 text-center" %}
47
- {% assign project_actions = project.actions | default: nil %}
48
- {% assign project_actions_class = project.actions_class | default: "mb-3" %}
49
- {% assign project_actions_btn_class = project.actions_btn_class | default: "btn text-nowrap m-1 btn-" %}
50
- {% assign project_resources = project.resources | default: nil %}
51
- {% assign project_resources_class = project.resources_class | default: "gap-2 d-md-flex justify-content-lg-center bg-dark p-2 rounded-top" %}
52
- {% assign project_resources_btn_class = project.resources_btn_class | default: "btn text-start text-nowrap btn-dark" %}
34
+ {%- assign with_project_data = include.data
35
+ | default: page.with_project_data
36
+ | default: site.data.project
37
+ | default: site.data.base.project
38
+ %}
39
+
40
+ {%- assign with_project_schema = site.data.base.project_schema.properties.with_project_data.properties %}
41
+
42
+ {%- if with_project -%}
43
+
44
+ {% assign project_class = with_project_data.class | default: with_project_schema.class.default %}
45
+ {% assign project_screenshot = with_project_data.screenshot | default: with_project_schema.screenshot.default %}
46
+ {% assign project_screenshot_class = with_project_data.screenshot_class | default: with_project_schema.screenshot_class.default %}
47
+ {% assign project_screenshot_alt = with_project_data.screenshot_alt | default: with_project_schema.screenshot_alt.default %}
48
+ {% assign project_image = with_project_data.image | default: with_project_schema.image.default %}
49
+ {% assign project_image_alt = with_project_data.image_alt | default: with_project_schema.image_alt.default %}
50
+ {% assign project_image_class = with_project_data.image_class | default: with_project_schema.image_class.default %}
51
+ {% assign project_image_style = with_project_data.image_style | default: with_project_schema.image_style.default %}
52
+ {% assign project_icon = with_project_data.icon | default: with_project_schema.icon.default %}
53
+ {% assign project_icon_class = with_project_data.icon_class | default: with_project_schema.icon_class.default %}
54
+ {% assign project_name = with_project_data.name | default: with_project_schema.name.default %}
55
+ {% assign project_name_class = with_project_data.name_class | default: with_project_schema.name_class.default %}
56
+ {% assign project_description = with_project_data.description | default: with_project_schema.description.default %}
57
+ {% assign project_description_class = with_project_data.description_class | default: with_project_schema.description_class.default %}
58
+ {% assign project_actions = with_project_data.actions | default: with_project_schema.actions.default %}
59
+ {% assign project_actions_class = with_project_data.actions_class | default: with_project_schema.actions_class.default %}
60
+ {% assign project_actions_btn_class = with_project_data.actions_btn_class | default: with_project_schema.actions_btn_class.default %}
61
+ {% assign project_resources = with_project_data.resources | default: with_project_schema.resources.default %}
62
+ {% assign project_resources_class = with_project_data.resources_class | default: with_project_schema.resources_class.default %}
63
+ {% assign project_resources_btn_class = with_project_data.resources_btn_class | default: with_project_schema.resources_btn_class.default %}
53
64
 
54
65
  <div class="d-flex{% if project_class != "" %} {{ project_class }}{% endif %}">
55
66
  <div class="container pt-5">
@@ -89,4 +100,5 @@ Data Source Hierarchy (priority):
89
100
  {%- endif %}
90
101
  </div>
91
102
  </div>
103
+
92
104
  {%- endif -%}
@@ -33,36 +33,44 @@ Conditional Logic:
33
33
  ================================================================================
34
34
  {% endcomment %}
35
35
 
36
- {%- if page.with_shortcut -%}
37
- {%- assign shortcut = include.data
36
+ {%- assign with_shortcut = include.with_shortcut
37
+ | default: page.with_shortcut
38
+ %}
39
+
40
+ {%- assign with_shortcut_data = include.data
38
41
  | default: page.with_shortcut_data
39
42
  | default: page.with_navbar_data
40
43
  | default: site.data.shortcut
41
44
  | default: site.data.navbar
42
45
  | default: site.data.base.shortcut
43
- | default: site.data.base.navbar %}
44
- {%- assign shortcut_navitems = shortcut.navitems | where: "visible_on", "footer" %}
46
+ | default: site.data.base.navbar
47
+ %}
48
+
49
+ {%- assign shortcut_navitems = with_shortcut_data.navitems | where: "visible_on", "footer" %}
45
50
 
46
- {%- comment %} === Presentation === {% endcomment %}
47
- {% if shortcut_navitems.size > 0 %}
48
- <div class="d-flex flex-wrap justify-content-evenly mb-4">
51
+ {%- if with_shortcut -%}
49
52
 
50
- {% for section in shortcut_navitems -%}
51
- <div class="pe-4">
52
- <div class="h6">{% if section.icon %}<i class="{{ section.icon }} me-1"></i>{% endif %}{{ section.name }}</div>
53
- <ul class="px-0 mb-4">
54
- {% for item in section.menu -%}
55
- <li class="list-unstyled my-1">
56
- {% include base/link.html.liquid
57
- name = item.name
58
- link = item.link
59
- color = "primary"
60
- %}
61
- </li>
53
+ {%- comment %} === Presentation === {% endcomment %}
54
+ {% if shortcut_navitems.size > 0 %}
55
+ <div class="d-flex flex-wrap justify-content-evenly mb-4">
56
+
57
+ {% for section in shortcut_navitems -%}
58
+ <div class="pe-4">
59
+ <p class="h6">{% if section.icon %}<i class="{{ section.icon }} me-1"></i>{% endif %}{{ section.name }}</p>
60
+ <ul class="px-0 mb-4">
61
+ {% for item in section.menu -%}
62
+ <li class="list-unstyled my-1">
63
+ {% include base/link.html.liquid
64
+ name = item.name
65
+ link = item.link
66
+ color = "primary"
67
+ %}
68
+ </li>
69
+ {% endfor %}
70
+ </ul>
71
+ </div>
62
72
  {% endfor %}
63
- </ul>
64
- </div>
65
- {% endfor %}
66
- </div>
67
- {% endif %}
73
+ </div>
74
+ {% endif %}
75
+
68
76
  {%- endif -%}
@@ -37,30 +37,40 @@ Conditional Logic:
37
37
  ================================================================================
38
38
  {% endcomment %}
39
39
 
40
- {%- assign social = include.data | default: page.with_social_data | default: site.data.social | default: site.data.base.social %}
41
- {%- assign social_class = social.class | default: site.data.base.social_schema.properties.with_social_data.properties.class.default %}
42
- {%- assign social_preamble = social.preamble | default: site.data.base.social_schema.properties.with_social_data.properties.preamble.default %}
43
- {%- assign social_preamble_class = social.preamble_class | default: site.data.base.social_schema.properties.with_social_data.properties.preamble_class.default %}
44
- {%- assign social_media = social.media | default: site.data.base.social_schema.properties.with_social_data.properties.media.default %}
40
+ {%- assign with_social = include.with_social
41
+ | default: page.with_social
42
+ %}
45
43
 
46
- {% if page.with_social %}
47
- <div {% if social_class != "" %}class="{{ social_class }}"{% endif %}>
44
+ {%- assign with_social_data = include.data
45
+ | default: page.with_social_data
46
+ | default: site.data.social
47
+ | default: site.data.base.social
48
+ %}
48
49
 
49
- {%- comment %} === Presentation (Begin) === {% endcomment %}
50
- {%- if social_preamble %}
51
- <p class="{{ social_preamble_class }}">{{ social_preamble }}</p>
52
- {%- endif %}
50
+ {%- assign with_social_schema = site.data.base.social_schema.properties.with_social_data.properties %}
51
+
52
+ {%- assign social_class = with_social_data.class | default: with_social_schema.class.default %}
53
+ {%- assign social_preamble = with_social_data.preamble | default: with_social_schema.preamble.default %}
54
+ {%- assign social_preamble_class = with_social_data.preamble_class | default: with_social_schema.preamble_class.default %}
55
+ {%- assign social_media = with_social_data.media | default: with_social_schema.media.default %}
56
+
57
+ {% if with_social %}
58
+
59
+ {%- comment %} === Presentation (Begin) === {% endcomment %}
60
+ {%- if social_preamble %}
61
+ <p class="{{ social_preamble_class }}">{{ social_preamble }}</p>
62
+ {%- endif %}
63
+
64
+ {%- for item in social_media -%}
65
+ {%- include base/link.html.liquid
66
+ class = "btn btn-outline-primary m-1"
67
+ link = item.link
68
+ role = "button"
69
+ icon = item.icon
70
+ aria_label = item.name
71
+ data_bs_title = item.name
72
+ %}
73
+ {%- endfor %}
74
+ {%- comment %} === Presentation (End) === {% endcomment %}
53
75
 
54
- {%- for item in social_media -%}
55
- {%- include base/link.html.liquid
56
- class = "btn btn-outline-primary m-1"
57
- link = item.link
58
- role = "button"
59
- icon = item.icon
60
- aria_label = item.name
61
- data_bs_title = item.name
62
- %}
63
- {%- endfor %}
64
- {%- comment %} === Presentation (End) === {% endcomment %}
65
- </div>
66
76
  {% endif %}
@@ -33,13 +33,24 @@ Conditional Logic:
33
33
  ================================================================================
34
34
  {% endcomment %}
35
35
 
36
- {%- assign sponsors = include.data | default: page.with_sponsors_data | default: site.data.sponsors | default: site.data.base.sponsors -%}
37
- {%- assign sponsors_members = sponsors.members | default: site.data.base.sponsors_schema.properties.with_sponsors_data.properties.members.default -%}
38
- {%- assign sponsors_image_base = sponsors.image_base_path | default: site.data.base.sponsors_schema.properties.with_sponsors_data.properties.image_base_path.default -%}
36
+ {%- assign with_sponsors = include.with_sponsors
37
+ | default: page.with_sponsors
38
+ %}
39
39
 
40
- {%- if page.with_sponsors -%}
41
- <div class="d-flex flex-wrap justify-content-between py-4 my-4 border-top border-bottom border-top-1 border-bottom-1">
40
+ {%- assign with_sponsors_data = include.data
41
+ | default: page.with_sponsors_data
42
+ | default: site.data.sponsors
43
+ | default: site.data.base.sponsors
44
+ %}
45
+
46
+ {%- assign with_sponsors_schema = site.data.base.sponsors_schema.properties.with_sponsors_data.properties %}
47
+
48
+ {%- assign sponsors_members = with_sponsors_data.members | default: with_sponsors_schema.members.default -%}
49
+ {%- assign sponsors_image_base = with_sponsors_data.image_base_path | default: with_sponsors_schema.image_base_path.default -%}
50
+
51
+ {%- if with_sponsors -%}
42
52
 
53
+ <div class="d-flex flex-wrap justify-content-between py-4 my-4 border-top border-bottom border-top-1 border-bottom-1">
43
54
  {%- comment %} === Presentation (Begin) === {% endcomment %}
44
55
  {%- for member in sponsors_members -%}
45
56
  {%- if member.is_active != false %}
@@ -53,6 +64,6 @@ Conditional Logic:
53
64
  {%- endif -%}
54
65
  {%- endfor %}
55
66
  {%- comment %} === Presentation (End) === {% endcomment %}
56
-
57
67
  </div>
68
+
58
69
  {%- endif -%}
@@ -37,21 +37,33 @@ Conditional Logic:
37
37
  ================================================================================
38
38
  {% endcomment %}
39
39
 
40
- {%- assign sponsors = include.data | default: page.with_sponsors_data | default: site.data.sponsors | default: site.data.base.sponsors -%}
41
- {%- assign sponsors_title = sponsors.title | default: site.data.base.sponsors_schema.properties.with_sponsors_data.properties.title.default -%}
42
- {%- assign sponsors_icon = sponsors.icon | default: site.data.base.sponsors_schema.properties.with_sponsors_data.properties.icon.default -%}
43
- {%- assign sponsors_message = sponsors.message | default: site.data.base.sponsors_schema.properties.with_sponsors_data.properties.message.default -%}
44
- {%- assign sponsors_members = sponsors.members | default: site.data.base.sponsors_schema.properties.with_sponsors_data.properties.members.default -%}
45
- {%- assign sponsors_image_base = sponsors.image_base_path | default: site.data.base.sponsors_schema.properties.with_sponsors_data.properties.image_base_path.default -%}
40
+ {%- assign with_sponsors = include.with_sponsors
41
+ | default: page.with_sponsors
42
+ %}
43
+
44
+ {%- assign with_sponsors_data = include.data
45
+ | default: page.with_sponsors_data
46
+ | default: site.data.sponsors
47
+ | default: site.data.base.sponsors
48
+ %}
49
+
50
+ {%- assign with_sponsors_schema = site.data.base.sponsors_schema.properties.with_sponsors_data.properties %}
51
+
52
+ {%- assign sponsors_title = with_sponsors_data.title | default: with_sponsors_schema.title.default -%}
53
+ {%- assign sponsors_icon = with_sponsors_data.icon | default: with_sponsors_schema.icon.default -%}
54
+ {%- assign sponsors_message = with_sponsors_data.message | default: with_sponsors_schema.message.default -%}
55
+ {%- assign sponsors_members = with_sponsors_data.members | default: with_sponsors_schema.members.default -%}
56
+ {%- assign sponsors_image_base = with_sponsors_data.image_base_path | default: with_sponsors_schema.image_base_path.default -%}
46
57
 
47
58
  {%- assign carousel_id = include.id | default: "sponsorsCarousel" -%}
48
59
 
49
- {%- if page.with_sponsors -%}
60
+ {%- if with_sponsors -%}
61
+
50
62
  <div id="{{ carousel_id }}" class="d-flex flex-wrap mb-5">
51
63
 
52
64
  {%- comment %} === Presentation (Begin) === {% endcomment %}
53
65
  {%- if include.with_title != false %}
54
- <div class="h6"><i class="{{ sponsors_icon }}"></i> {{ sponsors_title }}</div>
66
+ <p class="h6"><i class="{{ sponsors_icon }}"></i> {{ sponsors_title }}</p>
55
67
  {{ sponsors_message | markdownify | decorate_links }}
56
68
  {%- endif %}
57
69
 
@@ -75,4 +87,5 @@ Conditional Logic:
75
87
  {%- comment %} === Presentation (End) === {% endcomment %}
76
88
 
77
89
  </div>
90
+
78
91
  {%- endif -%}
@@ -34,21 +34,32 @@ Conditional Logic:
34
34
  ================================================================================
35
35
  {% endcomment %}
36
36
 
37
- {%- if page.with_title -%}
38
- {%- assign title_data = include.data | default: page.with_title_data | default: site.data.title | default: site.data.base.title %}
39
- {%- assign title_schema = site.data.base.title_schema.properties["with_title_data"].properties %}
37
+ {%- assign with_title = include.with_title
38
+ | default: page.with_title
39
+ %}
40
+
41
+ {%- assign with_title_data = include.data
42
+ | default: page.with_title_data
43
+ | default: site.data.title
44
+ | default: site.data.base.title
45
+ %}
46
+
47
+ {%- assign with_title_schema = site.data.base.title_schema.properties.with_title_data.properties %}
40
48
 
41
49
  {%- comment %} === Presentation === {% endcomment %}
42
- {%- assign class = title_data.class | default: title_schema["class"].default %}
43
- {%- assign title = title_data.title | default: page.title %}
44
- {%- assign title_class = title_data.title_class | default: title_schema["title_class"].default %}
45
- {%- assign title_lead = title_data.title_lead | default: page.title_lead %}
46
- {%- assign title_lead_class = title_data.title_lead_class | default: title_schema["title_lead_class"].default %}
50
+ {%- assign class = with_title_data.class | default: with_title_schema.class.default %}
51
+ {%- assign title = with_title_data.title | default: page.title %}
52
+ {%- assign title_class = with_title_data.title_class | default: with_title_schema.title_class.default %}
53
+ {%- assign title_lead = with_title_data.title_lead | default: page.title_lead %}
54
+ {%- assign title_lead_class = with_title_data.title_lead_class | default: with_title_schema.title_lead_class.default %}
55
+
56
+ {%- if page.with_title -%}
47
57
 
48
58
  <div class="{{ class }}">
49
- <div class="{{ title_class }}">{{ title }}</div>
59
+ <p class="{{ title_class }}">{{ title }}</p>
50
60
  {% if title_lead != "" %}
51
- <div class="{{ title_lead_class }}">{{ title_lead }}</div>
61
+ <p class="{{ title_lead_class }}">{{ title_lead }}</p>
52
62
  {% endif %}
53
63
  </div>
64
+
54
65
  {%- endif -%}
@@ -65,13 +65,13 @@ Data Source Hierarchy (in priority order):
65
65
  <div class="accordion-item">
66
66
  <div class="accordion-header" id="flush-headingOne">
67
67
  <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#flush-collapseOne" aria-expanded="false" aria-controls="flush-collapseOne">
68
- <i class="fa-solid fa-list"></i>
68
+ <i class="fa-solid fa-list" aria-hidden="true"></i>
69
69
  <span class="mx-3 fw-bold">On this page</span>
70
70
  </button>
71
71
  </div>
72
72
  <div id="flush-collapseOne" class="accordion-collapse collapse" data-bs-parent="#pageToc">
73
73
  <div class="accordion-body small">
74
- {%- include base/toc_generator.html.liquid
74
+ {%- include base/toc-generator.html.liquid
75
75
  id=id
76
76
  html=content
77
77
  class=class
@@ -1,9 +1,9 @@
1
1
  <!doctype html>
2
2
  <html lang="{{ page.lang | default: 'en' }}"{% if page.with_ogp %} prefix="og: https://ogp.me/ns#"{% endif %}>
3
- {% include base/head.html.liquid -%}
3
+ {% include base/partials/head.html.liquid -%}
4
4
  <body id="top" class="bg-body">
5
5
 
6
- {% include base/navbar.html.liquid -%}
6
+ {% include base/partials/navbar.html.liquid -%}
7
7
 
8
8
  {% include base/project.html.liquid %}
9
9
 
@@ -27,7 +27,7 @@
27
27
 
28
28
  {% if page.with_title %}
29
29
  <div class="row mb-3">
30
- <div class="{{ site.data.base.content.class | default: 'col' }}">
30
+ <div class="{{ site.data.base.partials.content.class | default: 'col' }}">
31
31
  {% include base/title.html.liquid %}
32
32
  </div>
33
33
  </div>
@@ -35,7 +35,7 @@
35
35
 
36
36
  {% if page.with_artwork %}
37
37
  <div class="row mb-3">
38
- <div class="{{ site.data.base.content.class | default: 'col' }}">
38
+ <div class="{{ site.data.base.partials.content.class | default: 'col' }}">
39
39
  {% include base/artwork.html.liquid %}
40
40
  </div>
41
41
  </div>
@@ -43,7 +43,7 @@
43
43
 
44
44
  {% if page.with_toc %}
45
45
  <div class="row mb-3">
46
- <div class="{{ site.data.base.content.class | default: 'col' }}">
46
+ <div class="{{ site.data.base.partials.content.class | default: 'col' }}">
47
47
  {% include base/toc.html.liquid %}
48
48
  </div>
49
49
  </div>
@@ -51,7 +51,7 @@
51
51
 
52
52
  {% if page.with_content %}
53
53
  <div class="row mb-3">
54
- <div class="{{ site.data.base.content.class | default: 'col' }} content">
54
+ <div class="{{ site.data.base.partials.content.class | default: 'col' }} content">
55
55
  {{ content }}
56
56
  </div>
57
57
  </div>
@@ -61,11 +61,11 @@
61
61
 
62
62
  {% if page.with_footer %}
63
63
  <footer class="footer small bg-dark text-centos-purple-100 pt-5">
64
- {% include base/footer.html.liquid -%}
64
+ {% include base/partials/footer.html.liquid -%}
65
65
  </footer>
66
66
  {% endif %}
67
67
 
68
- {% include base/script.html.liquid -%}
68
+ {% include base/partials/script.html.liquid -%}
69
69
 
70
70
  </body>
71
71
  </html>
@@ -176,6 +176,53 @@ main {
176
176
  scroll-margin-bottom: 100px;
177
177
  }
178
178
 
179
+ // -------------------------------------------------------------------------------
180
+ // Heading Anchor Component
181
+ // -------------------------------------------------------------------------------
182
+ // :has() guard: position context + right slot for the anchor icon.
183
+ // padding-right reserves space so the icon never overlaps heading text.
184
+ .content > h1:has(.heading-anchor),
185
+ .content > h2:has(.heading-anchor),
186
+ .content > h3:has(.heading-anchor),
187
+ .content > h4:has(.heading-anchor),
188
+ .content > h5:has(.heading-anchor),
189
+ .content > h6:has(.heading-anchor) {
190
+ position: relative;
191
+ padding-right: 1.5rem;
192
+ }
193
+ .content > h1 .heading-anchor,
194
+ .content > h2 .heading-anchor,
195
+ .content > h3 .heading-anchor,
196
+ .content > h4 .heading-anchor,
197
+ .content > h5 .heading-anchor,
198
+ .content > h6 .heading-anchor {
199
+ position: absolute;
200
+ right: 0;
201
+ top: 50%;
202
+ transform: translateY(-50%);
203
+ font-size: $font-size-base;
204
+ margin-left: 0 !important;
205
+ margin-right: 0 !important;
206
+ opacity: 0.2;
207
+ pointer-events: auto;
208
+ text-decoration: none;
209
+ }
210
+ .content > h1:hover .heading-anchor,
211
+ .content > h2:hover .heading-anchor,
212
+ .content > h3:hover .heading-anchor,
213
+ .content > h4:hover .heading-anchor,
214
+ .content > h5:hover .heading-anchor,
215
+ .content > h6:hover .heading-anchor,
216
+ .heading-anchor:focus {
217
+ opacity: 1;
218
+ }
219
+ .heading-anchor.is-active,
220
+ .heading-anchor.is-active i {
221
+ opacity: 1 !important;
222
+ visibility: visible !important;
223
+ color: var(--bs-primary);
224
+ }
225
+
179
226
  // Accordion containers' correction.
180
227
  //
181
228
  // When accessing accordion containers via internal anchor links, they wouldn't be