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,35 +1,7 @@
1
1
  {% comment %}
2
- ================================================================================
3
- Template: Breadcrumb Navigation Component
4
- Purpose: Renders hierarchical breadcrumb navigation showing page location
5
- in the site's URL structure. Excludes locale codes from the visible trail.
6
- ================================================================================
7
-
8
- Design Logic:
9
- - Automatic breadcrumb generation from page URL (no data config)
10
- - Hierarchical path visualization using URL splitting
11
- - Skips locale codes (e.g., /es/, /fr/) from visible breadcrumb
12
- - Home link always appears first as root
13
- - Current page title as active final item (non-clickable)
14
- - URL reconstruction preserves locale prefix in links
15
-
16
- Required Inputs:
17
- - page.url: Current page URL path (may include locale prefix)
18
- - page.original_url: URL without locale prefix (used for breadcrumb structure)
19
- - page.title: Display text for active breadcrumb
20
-
21
- Optional Inputs:
22
- - with_breadcrumb_data.arialabel: aria-label for the <nav> element (default: "breadcrumb")
23
- - column_class (include param): Bootstrap column class for the row wrapper (set by
24
- the layout to keep this component aligned with the content column; defaults to "col")
25
- - row_class (include param): Bootstrap class(es) for the row wrapper (set by
26
- the layout to keep this component's row aligned with title, artwork, toc,
27
- and content; defaults to "row mb-3")
28
-
29
- Data Source Hierarchy:
30
- - with_breadcrumb: include.with_breadcrumb → page.with_breadcrumb
31
- - with_breadcrumb_data: include.data → page.with_breadcrumb_data → site.data.breadcrumb → site.data.base.breadcrumb
32
- ================================================================================
2
+ breadcrumb: renders a Home-rooted breadcrumb trail from the page URL, keeping the locale prefix in links; content.html.liquid sets row_class and column_class.
3
+ Data: include.data > page.with_breadcrumb_data > site.data.breadcrumb > site.data.base.breadcrumb
4
+ Schema: src/YAML/breadcrumb_schema.yml
33
5
  {% endcomment %}
34
6
 
35
7
  {%- assign with_breadcrumb = include.with_breadcrumb
@@ -46,39 +18,33 @@ Data Source Hierarchy:
46
18
 
47
19
  {%- assign with_breadcrumb_schema = site.data.base.breadcrumb_schema.properties.with_breadcrumb_data.properties %}
48
20
 
49
- {%- comment %} Use original_url if available (without locale), otherwise use full url {%- endcomment %}
21
+ {%- comment %} page.original_url is the URL without the jekyll-l10n locale prefix. {%- endcomment %}
50
22
  {%- assign breadcrumb_url = page.original_url | default: page.url %}
51
23
 
52
- {%- comment %} Use plugin-provided locale (set for localized pages, defaults to 'en') {%- endcomment %}
24
+ {%- comment %} jekyll-l10n sets page.locale only on localized pages. {%- endcomment %}
53
25
  {%- assign detected_locale = page.locale | default: 'en' %}
26
+ {%- if detected_locale == 'en' %}
27
+ {%- assign crumb_prefix = '' %}
28
+ {%- else %}
29
+ {%- assign crumb_prefix = detected_locale | prepend: '/' %}
30
+ {%- endif %}
54
31
 
55
- {%- assign column_class = include.column_class | default: 'col' %}
56
- {%- assign row_class = include.row_class | default: 'row mb-3' %}
32
+ {%- assign column_class = include.column_class | default: site.data.base.content_schema.properties.with_content_data.properties.col_class.default %}
33
+ {%- assign row_class = include.row_class | default: site.data.base.content_schema.properties.with_content_data.properties.row_class.default %}
57
34
 
58
35
  <div class="{{ row_class }}">
59
36
  <div class="{{ column_class }}">
60
- <nav class="small" aria-label="{{ with_breadcrumb_data.arialabel | default: with_breadcrumb_schema.arialabel.default | default: 'breadcrumb' }}">
37
+ <nav class="small" aria-label="{{ with_breadcrumb_data.arialabel | default: with_breadcrumb_schema.arialabel.default }}">
61
38
  <ol class="breadcrumb mb-0">
62
- {%- comment %} Home link - adjust for locale {%- endcomment %}
63
- {%- if detected_locale == 'en' or detected_locale == '' %}
64
- <li class="breadcrumb-item"><a class="{{ site.with_link_decorator_data.default_link_classes }}" href="{{ site.baseurl }}/">Home</a></li>
65
- {%- else %}
66
- <li class="breadcrumb-item"><a class="{{ site.with_link_decorator_data.default_link_classes }}" href="{{ site.baseurl }}/{{ detected_locale }}/">Home</a></li>
67
- {%- endif %}
39
+ <li class="breadcrumb-item"><a class="{{ site.with_link_decorator_data.default_link_classes }}" href="{{ site.baseurl }}{{ crumb_prefix }}/">Home</a></li>
68
40
 
69
41
  {%- assign crumbs = breadcrumb_url | remove:'/index.html' | split: '/' %}
70
42
  {%- for crumb in crumbs offset: 1 %}
71
43
  {%- if forloop.last %}
72
44
  <li class="breadcrumb-item active">{{ page.title }}</li>
73
45
  {%- else %}
74
- {%- comment %} Build URL with locale prefix if not English {%- endcomment %}
75
46
  {%- assign crumb_limit = forloop.index | plus: 1 %}
76
- {%- if detected_locale == 'en' or detected_locale == '' %}
77
- {%- assign crumb_prefix = '' %}
78
- {%- else %}
79
- {%- assign crumb_prefix = detected_locale | prepend: '/' %}
80
- {%- endif %}
81
- <li class="breadcrumb-item"><a class="{{ site.with_link_decorator_data.default_link_classes }}" href="{{ site.baseurl }}{{ crumb_prefix }}{% for crumb in crumbs limit: crumb_limit %}{{ crumb | append: '/' | replace:'without-plugin/','without-plugins/' }}{% endfor %}">{{ crumb | replace:'-',' ' | remove:'.html' | capitalize }}</a></li>
47
+ <li class="breadcrumb-item"><a class="{{ site.with_link_decorator_data.default_link_classes }}" href="{{ site.baseurl }}{{ crumb_prefix }}{% for crumb in crumbs limit: crumb_limit %}{{ crumb | append: '/' }}{% endfor %}">{{ crumb | replace:'-',' ' | remove:'.html' | capitalize }}</a></li>
82
48
  {%- endif %}
83
49
  {%- endfor %}
84
50
  </ol>
@@ -1,32 +1,7 @@
1
1
  {% comment %}
2
- ================================================================================
3
- Template: Breaking News Component
4
- Purpose: Renders sticky alert banners for breaking news with multiple
5
- stacked alerts, colors, icons, and optional action links.
6
- ================================================================================
7
-
8
- Design Logic:
9
- - Sticky positioning: stays visible during page scroll
10
- - Stacking support: multiple alerts stack vertically
11
- - Dynamic scroll offset calculation: prevents header hiding
12
- - Icon and color support: visual categorization
13
- - Optional action links: "Know more" button
14
-
15
- Required Inputs:
16
- - content: Alert message text/HTML
17
-
18
- Optional Inputs:
19
- - color: Alert color scheme (default: "primary")
20
- - icon: Icon class for Font Awesome (default: "fa-solid fa-bullhorn")
21
- - link: URL for "Know more" button (optional)
22
- - data: Array of breaking news items
23
-
24
- Data Source Hierarchy (priority):
25
- 1. include.data
26
- 2. page.with_breakingnews_data
27
- 3. site.data.breakingnews
28
- 4. site.data.base.breakingnews
29
- ================================================================================
2
+ breakingnews: renders a sticky stack of alerts, one per item, each with an optional "Know more" button.
3
+ Data: include.data > page.with_breakingnews_data > site.data.breakingnews > site.data.base.breakingnews
4
+ Schema: src/YAML/breakingnews_schema.yml
30
5
  {% endcomment %}
31
6
 
32
7
  {%- assign with_breakingnews = include.with_breakingnews
@@ -43,38 +18,26 @@ Data Source Hierarchy (priority):
43
18
 
44
19
  {%- assign with_breakingnews_schema = site.data.base.breakingnews_schema.properties.with_breakingnews_data.items.properties %}
45
20
 
46
- {%- comment %} === Presentation === {% endcomment %}
47
- {%- assign breakingnews_alert_height = site.data.base.breakingnews_schema.properties.breakingnews_alert_height.default %}
48
- {%- assign navbar_height = site.data.base.navbar_schema.properties.navbar_height.default %}
49
-
50
21
  {%- if with_breakingnews_data.size > 0 %}
51
22
  <div class="sticky-top sticky-top-breakingnews">
52
23
  {% for item in with_breakingnews_data %}
53
-
54
- {%- comment %} --- Defaults --- {% endcomment %}
55
- {% if forloop.first %}
56
- {% assign breakingnews_alerts_height = breakingnews_alert_height | plus: navbar_height %}
57
- {% else %}
58
- {% assign breakingnews_alerts_height = breakingnews_alerts_height | plus: breakingnews_alert_height %}
59
- {% endif %}
60
24
  {%- assign breakingnews_color = item.color | default: with_breakingnews_schema.color.default %}
61
25
  {%- assign breakingnews_btn_class = "btn btn-sm text-nowrap btn-" | append: breakingnews_color %}
62
26
  {%- assign breakingnews_icon = item.icon | default: with_breakingnews_schema.icon.default %}
63
-
64
- {%- comment %} --- HTML --- {% endcomment %}
27
+ {%- comment %} The pinned Liquid has no remove_last, so split/join drops the trailing "</p>" markdownify adds. {% endcomment %}
28
+ {%- assign breakingnews_content_html = item.content | markdownify | strip | remove_first: "<p>" | split: "</p>" | join: "</p>" | strip %}
65
29
  <div class="breakingnews alert alert-{{ breakingnews_color }} p-2 rounded-0 m-0 border-start-0 border-end-0 shadow" role="alert">
66
30
  <div class="container d-flex justify-content-between align-items-center">
67
31
  <div class="me-3">
68
32
  <div class="h6 mb-0"><i class="{{ breakingnews_icon }}"></i></div>
69
33
  </div>
70
- <p class="flex-fill text-start mb-0">{{ item.content }}</p>
34
+ <p class="flex-fill text-start mb-0">{{ breakingnews_content_html }}</p>
71
35
  {%- if item.link %}
72
36
  <div>
73
37
  {% include base/link.html.liquid
74
38
  name = "Know more"
75
39
  icon = "fa-solid fa-arrow-right"
76
40
  icon_position = "end"
77
- role = "button"
78
41
  class = breakingnews_btn_class
79
42
  color = breakingnews_color
80
43
  link = item.link
@@ -1,41 +1,7 @@
1
1
  {% comment %}
2
- ================================================================================
3
- Template: Calendar Event Data Bridge
4
- Purpose: Emits the SAME event data the `event` component reads (with_event_data)
5
- as a JSON script tag, so a page can populate an Event Calendar instance
6
- without hand-writing (and duplicating) a separate JS events array. Data
7
- loading only — mapping this JSON into the Event Calendar library's own event
8
- shape, and calling EventCalendar.create(), stays the responsibility of
9
- whatever page or layout uses it (see calendar.html.liquid, which follows the
10
- same "loading only" split for the library itself).
11
-
12
- Design Logic:
13
- - Data bridge only: re-emits with_event_data as JSON, no field mapping or
14
- rendering — see calendar-init.html.liquid for the mapping/rendering step
15
- - Shared data source: reuses event.html.liquid's exact fallback chain, so
16
- both components always agree on the same resolved events
17
- - JSON script tag output: consumable by inline JS without hand-duplicating
18
- the events array
19
- - Multi-instance support: "id" override lets multiple bridges coexist on
20
- one page
21
-
22
- Optional Inputs:
23
- - id: script tag id (default: "centos-calendar-events") — override to run
24
- more than one instance of this bridge on the same page (see
25
- calendar-init.html.liquid, which derives a unique id per instance).
26
-
27
- Data Source Hierarchy (priority) — identical to event.html.liquid, so this
28
- bridge always reflects whatever with_event_data the page actually resolved:
29
- 1. include.data
30
- 2. page.with_event_data
31
- 3. site.data.event
32
- 4. site.data.base.event
33
-
34
- Output: <script type="application/json" id="...">, holding the with_event_data
35
- array unchanged (title, start, end, color, icon, link, description,
36
- location) — see the calendar component's event data contract documentation
37
- for how a page maps these fields into Event Calendar events.
38
- ================================================================================
2
+ calendar-events: renders the resolved event data as a JSON script tag for a calendar instance to read.
3
+ Data: include.data > page.with_event_data > site.data.event > site.data.base.event
4
+ Schema: src/YAML/event_schema.yml
39
5
  {% endcomment %}
40
6
 
41
7
  {%- assign with_event_data = include.data
@@ -1,63 +1,9 @@
1
1
  {% comment %}
2
- ================================================================================
3
- Template: Calendar Instance Initializer
4
- Purpose: Renders a ready-to-use Event Calendar instance — the events data
5
- (via calendar-events.html.liquid), a container element, and the
6
- initialization script that maps that data into the library's own event
7
- shape (see the calendar component's event data contract documentation) and
8
- calls EventCalendar.create(). Configured entirely from with_calendar_data /
9
- calendar_schema.yml, so customizing view, toolbar, or button labels is a
10
- front matter change — no script editing required.
11
-
12
- Design Logic:
13
- - Composition: wires together the events bridge, a container element, and
14
- the initialization script — each piece stays a separate, single-purpose
15
- include
16
- - Self-contained with graceful fallback: works standalone via
17
- with_calendar_data.events, or falls back to the event component's
18
- with_event_data when that's absent (see Event data source, below)
19
- - Config-driven: view, toolbar, and button labels all come from
20
- with_calendar_data — no script editing required
21
- - Multi-instance support: a distinct "id" per include call renders
22
- independent calendars on one page
23
- - Security: blocks javascript:/data:/vbscript: URIs before eventClick
24
- navigation
25
-
26
- Required Inputs (per event item, from whichever event data source resolves
27
- below — the init script below reads event.title/event.start directly):
28
- - title: Event name/title
29
- - start: Event start (YYYY-MM-DD for an all-day event, or
30
- YYYY-MM-DDTHH:MM to give it a specific start time on that same day)
31
-
32
- Optional Inputs:
33
- - id: container element id (default: "centos-calendar")
34
- - data: with_calendar_data override
35
- - event_data: explicit per-instance event array — highest priority, mainly
36
- for running multiple independent calendars on one page (see below).
37
- Forwarded to calendar-events.html.liquid's own "data" param.
38
-
39
- Data Source Hierarchy (priority) — identical to calendar.html.liquid:
40
- 1. include.data
41
- 2. page.with_calendar_data
42
- 3. site.data.calendar
43
- 4. site.data.base.calendar
44
-
45
- Event data source (priority) — this is what makes the component
46
- self-contained: a calendar-only page never has to touch with_event_data,
47
- but pages that already use the event component keep working unchanged:
48
- 1. include.event_data — explicit override for this include call.
49
- 2. with_calendar_data.events — calendar-specific events, resolved above.
50
- 3. with_event_data — the event component's own data (via
51
- calendar-events.html.liquid's own fallback chain: include.data (unused
52
- here) → page.with_event_data → site.data.event → site.data.base.event).
53
-
54
- Multiple instances per page: pass a distinct id to each include call. The
55
- events bridge id is derived from it ("<id>-events"), so each instance's
56
- event data (and the events script tag emitting it) stays independent. Pass
57
- event_data (or a distinct with_calendar_data.events via data=) alongside a
58
- distinct id when instances should show different events; omit both to have
59
- every instance fall back to the same shared event source.
60
- ================================================================================
2
+ calendar-init: renders a calendar container, its events JSON, and the script that creates the Event Calendar instance.
3
+ Data config: include.data > page.with_calendar_data > site.data.calendar > site.data.base.calendar
4
+ Data events: include.event_data > with_calendar_data.events > page.with_event_data > site.data.event > site.data.base.event
5
+ Schema: src/YAML/calendar_schema.yml
6
+ Requires: base/calendar.html.liquid type="script" (the EventCalendar global)
61
7
  {% endcomment %}
62
8
 
63
9
  {%- assign with_calendar = include.with_calendar
@@ -76,8 +22,6 @@ every instance fall back to the same shared event source.
76
22
  %}
77
23
 
78
24
  {%- assign with_calendar_schema = site.data.base.calendar_schema.properties.with_calendar_data.properties %}
79
-
80
- {%- comment %} --- Defaults --- {% endcomment %}
81
25
  {%- assign calendar_view = with_calendar_data.view | default: with_calendar_schema.view.default %}
82
26
  {%- assign calendar_toolbar_start = with_calendar_data.header_toolbar_start | default: with_calendar_schema.header_toolbar_start.default %}
83
27
  {%- assign calendar_toolbar_center = with_calendar_data.header_toolbar_center | default: with_calendar_schema.header_toolbar_center.default %}
@@ -89,6 +33,7 @@ every instance fall back to the same shared event source.
89
33
  {%- assign calendar_btn_today = with_calendar_data.button_text_today | default: with_calendar_schema.button_text_today.default %}
90
34
 
91
35
  {%- assign calendar_events_data = include.event_data | default: with_calendar_data.events %}
36
+ {%- assign calendar_event_color = site.data.base.event_schema.properties.with_event_data.items.properties.color.default %}
92
37
 
93
38
  {% include base/calendar-events.html.liquid id=calendar_events_id data=calendar_events_data %}
94
39
  <div id="{{ calendar_id }}"></div>
@@ -113,7 +58,7 @@ document.addEventListener('DOMContentLoaded', function () {
113
58
  start: start,
114
59
  end: end,
115
60
  allDay: allDay,
116
- backgroundColor: 'var(--bs-' + (event.color || 'secondary') + ')',
61
+ backgroundColor: 'var(--bs-' + (event.color || {{ calendar_event_color | jsonify }}) + ')',
117
62
  extendedProps: { url: event.link }
118
63
  };
119
64
  });
@@ -134,7 +79,6 @@ document.addEventListener('DOMContentLoaded', function () {
134
79
  },
135
80
  events: events,
136
81
  eventClick: function (info) {
137
- // --- Security: block javascript:/data:/vbscript: URIs before navigation ---
138
82
  var url = info.event.extendedProps.url;
139
83
  var normalized = url ? String(url).replace(/[\x00-\x20]/g, '') : '';
140
84
  if (url && !/^(javascript|data|vbscript):/i.test(normalized)) {
@@ -1,32 +1,7 @@
1
1
  {% comment %}
2
- ================================================================================
3
- Template: Event Calendar Library Initialization Component
4
- Purpose: Loads the Event Calendar JS library (@event-calendar/build, formerly
5
- vkurko/calendar) from CDN with SRI integrity checks. Library loading only —
6
- initializing a calendar instance (mounting an element and supplying its
7
- events data) is the responsibility of whatever page or layout uses it.
8
- ================================================================================
9
-
10
- Design Logic:
11
- - Library loading only: does not mount or configure a calendar instance —
12
- see calendar-init.html.liquid for that
13
- - Split head/script output: "type" selects the CSS <link> (head) or JS
14
- <script> (body) tag, capturing both fragments once and rendering by type
15
- - CDN-hosted with Subresource Integrity (SRI): version-pinned, integrity-
16
- checked delivery
17
-
18
- Optional Inputs:
19
- - type: "head" for CSS include, "script" for JavaScript
20
- - version: Event Calendar version (e.g., "5.12.0")
21
- - css_integrity, script_integrity: SRI integrity hashes
22
- - data: Event Calendar configuration object
23
-
24
- Data Source Hierarchy (priority):
25
- 1. include.data
26
- 2. page.with_calendar_data
27
- 3. site.data.calendar
28
- 4. site.data.base.calendar
29
- ================================================================================
2
+ calendar: loads the Event Calendar library from the CDN. head.html.liquid calls it with type="head" (CSS) and type="script" (JS).
3
+ Data: include.data > page.with_calendar_data > site.data.calendar > site.data.base.calendar
4
+ Schema: src/YAML/calendar_schema.yml
30
5
  {% endcomment %}
31
6
 
32
7
  {%- assign with_calendar = include.with_calendar
@@ -42,9 +17,6 @@ Data Source Hierarchy (priority):
42
17
  {%- assign with_calendar_schema = site.data.base.calendar_schema.properties.with_calendar_data.properties %}
43
18
 
44
19
  {%- if with_calendar %}
45
-
46
- {%- comment %} === Presentation === {% endcomment %}
47
- {%- comment %} --- Defaults --- {% endcomment %}
48
20
  {%- assign calendar_version = with_calendar_data.version | default: with_calendar_schema.version.default %}
49
21
  {%- assign calendar_css_integrity = with_calendar_data.css_integrity | default: with_calendar_schema.css_integrity.default %}
50
22
  {%- assign calendar_script_integrity = with_calendar_data.script_integrity | default: with_calendar_schema.script_integrity.default %}
@@ -54,11 +26,8 @@ Data Source Hierarchy (priority):
54
26
  {%- endcapture %}
55
27
 
56
28
  {%- capture html_calendar_script %}
57
- <!-- Event Calendar Library -->
58
29
  <script src="https://cdn.jsdelivr.net/npm/@event-calendar/build@{{ calendar_version }}/dist/event-calendar.min.js" integrity="{{ calendar_script_integrity }}" crossorigin="anonymous" referrerpolicy="no-referrer" defer></script>
59
30
  {%- endcapture %}
60
-
61
- {%- comment %} --- HTML --- {% endcomment %}
62
31
  {%- assign type = include.type %}
63
32
  {%- case type %}
64
33
  {%- when "head" %}
@@ -1,37 +1,6 @@
1
1
  {% comment %}
2
- ================================================================================
3
- Template: Flexible Card Component
4
- Purpose: Renders highly configurable card layouts with optional image,
5
- icon, title, description, and action buttons.
6
- ================================================================================
7
-
8
- Design Logic:
9
- - Modular design: each section is optional
10
- - Capture-block approach: builds HTML fragments for reusability
11
- - Conditional rendering: only renders sections with content
12
- - Bootstrap flexbox-based layout for responsive design
13
- - Reuses link component for action buttons
14
-
15
- Optional Inputs:
16
- - class: Card container CSS classes
17
- - color: Color scheme for styling (default: "primary")
18
- - image, icon, screenshot: Visual elements
19
- - name, description: Text content, run through Liquid's `markdownify` filter
20
- so inline Markdown (e.g. `` `code` `` spans) renders as HTML. The
21
- paragraph wrapper kramdown adds is stripped, since each already renders
22
- inside its own `<p>`.
23
- - name_link: URL to wrap `name` in a link, rendered via
24
- base/link.html.liquid. Empty by default (name renders as plain text).
25
- - name_link_class: CSS classes for the name_link anchor (e.g. "link-dark").
26
- Ignored when name_link is empty; when left empty, falls back to
27
- base/link.html.liquid's own color-driven default styling, driven by this
28
- card's own `color` parameter (not a hardcoded "primary").
29
- - actions: Array of action buttons [{name, link, icon}]
30
- - All image/icon/name/description have customizable CSS classes
31
-
32
- Data Source:
33
- - Derived from include parameters only
34
- ================================================================================
2
+ card: renders a card with an optional image, icon, name, description, screenshot, and action buttons.
3
+ Schema: src/YAML/card_schema.yml
35
4
  {% endcomment %}
36
5
 
37
6
  {%- assign with_card_schema = site.data.base.card_schema.properties %}
@@ -56,11 +25,8 @@ Data Source:
56
25
  {%- assign card_description_class = include.description_class | default: with_card_schema.description_class.default %}
57
26
  {%- assign card_actions = include.actions | default: with_card_schema.actions.default %}
58
27
  {%- assign card_actions_class = include.actions_class | default: with_card_schema.actions_class.default %}
59
- {%- assign card_actions_btn_class = include.actions_btn_class | default: "btn m-1 btn-" | append: card_color %}
60
-
61
- {%- comment %} === Presentation === {% endcomment %}
28
+ {%- assign card_actions_btn_class = include.actions_btn_class | default: with_card_schema.actions_btn_class.default | replace: "{color}", card_color %}
62
29
 
63
- {%- comment %} --- Defaults --- {% endcomment %}
64
30
  {%- capture html_card_screenshot -%}
65
31
  {% if card_screenshot != "" %}
66
32
  <div class="bg-{{ card_color }} rounded mb-3">
@@ -81,11 +47,7 @@ Data Source:
81
47
  {% endif %}
82
48
  {%- endcapture %}
83
49
 
84
- {%- comment %} Liquid 4.0.4 (this project's pinned version) has no remove_last/replace_last
85
- filter, so the trailing "</p>" kramdown adds is stripped via split/join
86
- instead: splitting on "</p>" drops the trailing empty segment left by the
87
- closing tag at the very end of the string, and joining the remaining parts
88
- back with "</p>" reconstructs everything except that final occurrence. {% endcomment %}
50
+ {%- comment %} The pinned Liquid has no remove_last, so split/join drops the trailing "</p>" kramdown adds. {% endcomment %}
89
51
  {%- capture card_name_markdown -%}{{ card_name | markdownify }}{%- endcapture -%}
90
52
  {%- assign card_name_html = card_name_markdown | strip | remove_first: "<p>" | split: "</p>" | join: "</p>" | strip -%}
91
53
 
@@ -110,7 +72,6 @@ Data Source:
110
72
  {%- for action in card_actions %}
111
73
  {%- include base/link.html.liquid
112
74
  class = card_actions_btn_class
113
- role = "button"
114
75
  name = action.name
115
76
  link = action.link
116
77
  icon = action.icon
@@ -121,7 +82,6 @@ Data Source:
121
82
  {% endif %}
122
83
  {%- endcapture %}
123
84
 
124
- {%- comment %} --- HTML --- {% endcomment -%}
125
85
  <div class="d-flex{% if card_class != "" %} {{ card_class }}{% endif %}">
126
86
  {{- html_card_image | strip -}}
127
87
  {{- html_card_icon | strip -}}
@@ -1,3 +1,8 @@
1
+ {% comment %}
2
+ color-table: renders a table with one row per color in include.collection, with its color values, WCAG results, and a WebAIM check link; each value is a copy button when page.with_copyvalue is on, or plain code otherwise.
3
+ Schema: src/YAML/color_schema.yml
4
+ {% endcomment %}
5
+ {%- comment %} trim leading output {% endcomment -%}
1
6
  <div class="table-responsive bg-light border rounded mb-3">
2
7
  <table class="table dataTable">
3
8
  <thead>
@@ -13,6 +18,11 @@
13
18
  </tr>
14
19
  </thead>
15
20
  <tbody>
21
+ {%- comment %} Same gate as base/copyvalue.html.liquid: no copy script means no copy buttons. {% endcomment %}
22
+ {%- assign color_table_copy = false %}
23
+ {%- if page.with_copyvalue %}
24
+ {%- assign color_table_copy = true %}
25
+ {%- endif %}
16
26
  {%- for item in include.collection %}
17
27
  {%- if include.name_field == "full_name" %}
18
28
  {%- assign _item_name = item.full_name | remove: '$' %}
@@ -22,12 +32,16 @@
22
32
  {%- assign _webaim_fcolor = item.text_color_hex | remove: '#' | upcase %}
23
33
  {%- assign _webaim_bcolor = item.hex | remove: '#' | upcase %}
24
34
  {%- capture _webaim_link %}https://webaim.org/resources/contrastchecker/?fcolor={{ _webaim_fcolor }}&bcolor={{ _webaim_bcolor }}{%- endcapture %}
35
+ {%- assign text_color_tooltip = item.text_color %}
36
+ {%- if item.text_color == "Black" %}
37
+ {%- assign text_color_tooltip = item.text_color | append: " — near-black brand color, not literal black" %}
38
+ {%- endif %}
25
39
  <tr>
26
40
  <td class="text-nowrap">{{ _item_name }}</td>
27
- <td class="text-nowrap"><i class="fas fa-circle fa-xl" style="color: {{ item.hex }}"></i><button type="button" class="copy-btn focus-ring" data-bs-toggle="tooltip" data-bs-title="Copy hex value" data-copy-value="{{ item.hex }}" aria-label="Copy hex value {{ item.hex }}"><code>{{ item.hex }}</code> <span class="fa-regular fa-copy"></span></button></td>
28
- <td class="text-nowrap"><button type="button" class="copy-btn focus-ring" data-bs-toggle="tooltip" data-bs-title="Copy RGB value" data-copy-value="{{ item.rgb }}" aria-label="Copy RGB value {{ item.rgb }}"><code>{{ item.rgb }}</code> <span class="fa-regular fa-copy"></span></button></td>
29
- <td class="text-nowrap"><button type="button" class="copy-btn focus-ring" data-bs-toggle="tooltip" data-bs-title="Copy HSV value" data-copy-value="{{ item.hsv }}" aria-label="Copy HSV value {{ item.hsv }}"><code>{{ item.hsv }}</code> <span class="fa-regular fa-copy"></span></button></td>
30
- <td class="text-nowrap">{% if item.text_color == "Black" %}<span class="badge {{ item.text_badge }}" data-bs-toggle="tooltip" data-bs-title="{{ item.text_color }} — near-black brand color, not literal black"><span aria-hidden="true">{{ item.text_color | slice: 0, 1 }}</span><span class="visually-hidden">{{ item.text_color }}</span></span>{% else %}<span class="badge {{ item.text_badge }}" data-bs-toggle="tooltip" data-bs-title="{{ item.text_color }}"><span aria-hidden="true">{{ item.text_color | slice: 0, 1 }}</span><span class="visually-hidden">{{ item.text_color }}</span></span>{% endif %} <button type="button" class="copy-btn focus-ring" data-bs-toggle="tooltip" data-bs-title="Copy text color hex value" data-copy-value="{{ item.text_color_hex }}" aria-label="Copy text color hex value {{ item.text_color_hex }}"><code>{{ item.text_color_hex }}</code> <span class="fa-regular fa-copy"></span></button></td>
41
+ <td class="text-nowrap"><i class="fas fa-circle fa-xl" style="color: {{ item.hex }}"></i>{% if color_table_copy %}<button type="button" class="copy-btn focus-ring" data-bs-toggle="tooltip" data-bs-title="Copy hex value" data-copy-value="{{ item.hex }}" aria-label="Copy hex value {{ item.hex }}"><code>{{ item.hex }}</code> <span class="fa-regular fa-copy"></span></button>{% else %}<code>{{ item.hex }}</code>{% endif %}</td>
42
+ <td class="text-nowrap">{% if color_table_copy %}<button type="button" class="copy-btn focus-ring" data-bs-toggle="tooltip" data-bs-title="Copy RGB value" data-copy-value="{{ item.rgb }}" aria-label="Copy RGB value {{ item.rgb }}"><code>{{ item.rgb }}</code> <span class="fa-regular fa-copy"></span></button>{% else %}<code>{{ item.rgb }}</code>{% endif %}</td>
43
+ <td class="text-nowrap">{% if color_table_copy %}<button type="button" class="copy-btn focus-ring" data-bs-toggle="tooltip" data-bs-title="Copy HSV value" data-copy-value="{{ item.hsv }}" aria-label="Copy HSV value {{ item.hsv }}"><code>{{ item.hsv }}</code> <span class="fa-regular fa-copy"></span></button>{% else %}<code>{{ item.hsv }}</code>{% endif %}</td>
44
+ <td class="text-nowrap"><span class="badge {{ item.text_badge }}" data-bs-toggle="tooltip" data-bs-title="{{ text_color_tooltip }}"><span aria-hidden="true">{{ item.text_color | slice: 0, 1 }}</span><span class="visually-hidden">{{ item.text_color }}</span></span> {% if color_table_copy %}<button type="button" class="copy-btn focus-ring" data-bs-toggle="tooltip" data-bs-title="Copy text color hex value" data-copy-value="{{ item.text_color_hex }}" aria-label="Copy text color hex value {{ item.text_color_hex }}"><code>{{ item.text_color_hex }}</code> <span class="fa-regular fa-copy"></span></button>{% else %}<code>{{ item.text_color_hex }}</code>{% endif %}</td>
31
45
  <td class="text-nowrap"><code>{{ item.contrast_ratio | remove: '`' }}</code> {% include base/link.html.liquid link=_webaim_link target="_blank" class="text-decoration-none" icon="fas fa-external-link-alt" data_bs_toggle="tooltip" data_bs_title="Verify with WebAIM" aria_label="Verify contrast ratio with WebAIM" %}</td>
32
46
  <td class="text-nowrap">{% if item.wcag_2_2_aa %}<span class="d-inline-block" data-bs-toggle="tooltip" title="Exceeds WCAG 2.2 AA standard (4.5:1 minimum)"><i class="fas fa-circle-check text-success"></i></span>{% else %}<span class="d-inline-block" data-bs-toggle="tooltip" title="Underperforms WCAG 2.2 AA standard (4.5:1 minimum)"><i class="fas fa-circle-xmark text-danger"></i></span>{% endif %} <code>{{ item.wcag_2_2_aa_margin | remove: '`' }}</code></td>
33
47
  <td class="text-nowrap">{% if item.wcag_2_2_aaa %}<span class="d-inline-block" data-bs-toggle="tooltip" title="Exceeds WCAG 2.2 AAA standard (7.0:1 minimum)"><i class="fas fa-circle-check text-success"></i></span>{% else %}<span class="d-inline-block" data-bs-toggle="tooltip" title="Underperforms WCAG 2.2 AAA standard (7.0:1 minimum)"><i class="fas fa-circle-xmark text-danger"></i></span>{% endif %} <code>{{ item.wcag_2_2_aaa_margin | remove: '`' }}</code></td>
@@ -1,56 +1,10 @@
1
1
  {% comment %}
2
- ================================================================================
3
- Template: Configuration Variables — Default Cell
4
- Purpose: Renders one Default-column cell's contents. Included from both
5
- configuration_variables.html.liquid (top-level table) and
6
- configuration_variables-nested.html.liquid (recursive nested tables) so every
7
- schema-driven Name/Type/Default/Description table presents a long default
8
- value the same way, with one shared rule instead of two copies that could
9
- drift apart.
10
-
11
- Behavior:
12
- - Liquid's `default` filter treats `false` as blank, so a plain
13
- `include.default | default: "—"` would hide a real `false` value. This nil
14
- check keeps `false` distinct from "no default set".
15
- - An explicit `default: ""` (e.g. download_schema.yml's `iso`/`rpm`/`link`
16
- URLs, whose description already says "Empty hides the ... button") is a
17
- real, intentional default — not the same as "no default declared". Left to
18
- fall through to `<code>{{ default_value }}</code>`, it renders as a visibly
19
- empty inline code element: sighted users read it as a rendering glitch, and
20
- a screen reader announces an empty `<code>` with no indication a value is
21
- even there, which fails WCAG 1.3.1 (the "default is an empty string" fact
22
- is conveyed by absence alone, not programmatically). It gets its own
23
- `<code>""</code>` rendering plus a `.visually-hidden` "(empty string)" note,
24
- so the cell reads as a value distinct from both `—` (nil) and a populated
25
- default.
26
- - Every real default value renders as `<code>`, the same as the Name and
27
- Type columns — a config default is a literal value, not prose, so it's
28
- shown raw (escaped, not markdownified) rather than interpreted as
29
- Markdown. The nil placeholder `—` is left plain, since it isn't a value.
30
- - A default value with a long unbroken run of characters (an SRI hash, a
31
- CDN URL, ...) forces its column wide under normal table auto-layout, at
32
- the Description column's expense, regardless of how many columns the
33
- table has. Truncating it into a fixed-width single-line box instead would
34
- need scrolling or selecting to read the rest, which runs against WCAG
35
- 1.4.10 Reflow. Past `long_value_threshold` characters with no space to
36
- wrap at, the *longest unbroken token* (not the value's total length —
37
- see below) gets the extra `.long-value` class (breaks at any character
38
- via `overflow-wrap: anywhere`, see _customization.scss): the full value
39
- stays visible with no interaction required, and it takes only the width
40
- it actually needs.
41
- - Checked by longest unbroken token, not total length: a value can be long
42
- overall but still wrap fine on its own spaces (a class list, a sentence);
43
- what actually forces a column wide is one run with nowhere to break.
44
- - Only `type: string` values are checked for length — a boolean or number
45
- is never "long", and running `split`/`size` on a non-string isn't
46
- reliable.
47
-
48
- Required Inputs:
49
- - default: The raw prop_details.default value (may be nil, false, a string, etc.)
50
- - type: The property's schema `type`, e.g. "string", "boolean".
51
- ================================================================================
2
+ configuration_variables-default-cell: renders one Default cell as a dash, an empty-string marker, or the escaped value in code, letting long unbroken values wrap.
52
3
  {% endcomment %}
53
4
 
5
+ {% comment %} Include variables persist between calls, so reset the flag before any branch sets it. {% endcomment -%}
6
+ {% assign is_empty_string = false -%}
7
+ {% comment %} == nil keeps an explicit false default distinct from no default; the default filter treats false as blank. {% endcomment -%}
54
8
  {% if include.default == nil %}
55
9
  {% assign default_value = "—" %}
56
10
  {% elsif include.default == "" %}
@@ -60,6 +14,7 @@ Required Inputs:
60
14
  {% assign default_value = include.default %}
61
15
  {% endif %}
62
16
 
17
+ {% comment %} Only the longest unbroken token of a string forces its column wide; past the threshold it gets .long-value so it wraps. {% endcomment -%}
63
18
  {% assign long_value_threshold = 24 %}
64
19
  {% assign max_token_length = 0 %}
65
20
  {% if include.type == "string" and default_value != "—" %}
@@ -72,6 +27,7 @@ Required Inputs:
72
27
  {% endfor %}
73
28
  {% endif %}
74
29
 
30
+ {% comment %} An explicit "" default gets a visible marker and a screen-reader note instead of an empty code element. {% endcomment -%}
75
31
  {% if default_value == "—" %}
76
32
  —
77
33
  {% elsif is_empty_string %}
@@ -1,6 +1,6 @@
1
1
  {% comment %}
2
- Generates one separate table and then triggers subsequent recursion to produce
3
- others. Requires two distinct loops for valid HTML structure.
2
+ configuration_variables-nested: renders one table for a nested property, then recurses into its own nested properties.
3
+ Schema: src/YAML/configuration_variables_schema.yml
4
4
  {% endcomment %}
5
5
 
6
6
  {% assign current_properties = include.properties %}
@@ -8,10 +8,10 @@ others. Requires two distinct loops for valid HTML structure.
8
8
  {% assign current_level = include.level | plus: 0 %}
9
9
  {% assign type_desc = include.type_desc %}
10
10
 
11
- {% assign col_name = include.col_name | default: "Name" %}
12
- {% assign col_type = include.col_type | default: "Type" %}
13
- {% assign col_default = include.col_default | default: "Default" %}
14
- {% assign col_description = include.col_description | default: "Description" %}
11
+ {% assign col_name = include.col_name %}
12
+ {% assign col_type = include.col_type %}
13
+ {% assign col_default = include.col_default %}
14
+ {% assign col_description = include.col_description %}
15
15
 
16
16
  {% assign columns = include.columns %}
17
17
 
@@ -20,7 +20,6 @@ others. Requires two distinct loops for valid HTML structure.
20
20
  {% assign table_classes = "table dataTable" %}
21
21
  {% assign table_id = parent_name | slugify | append: '-nested-' | append: current_level %}
22
22
 
23
- {% comment %} Loop 1: render this table {% endcomment %}
24
23
  <p class="my-3">The <code>{{ parent_name }}</code> variable is a {{ type_desc }} with the following properties:</p>
25
24
 
26
25
  <table id="{{ table_id }}" class="{{ table_classes }}">