reconnect

This commit is contained in:
Nasir Anthony Montalvo
2026-01-26 02:25:43 -06:00
parent 6609527c97
commit 0a854da998
135 changed files with 8792 additions and 1 deletions

11
.github/_layouts/about-narrow.html vendored Normal file
View File

@@ -0,0 +1,11 @@
---
# narrow text block "About" page layout
# text block is centered
layout: default
---
<div class="container my-4 about-narrow-contents">
{% include feature/jumbotron.html %}
{{ content }}
</div>
{% if page.credits == true %}{% include cb/credits.html %}{% endif %}

116
.github/_layouts/about.html vendored Normal file
View File

@@ -0,0 +1,116 @@
---
# default "About" page layout
# provides a full width featured image at top
# with an auto generated TOC nav on the left and a narrow text block
layout: default
---
{% if page.about-featured-image or page.heading or page.sub-heading %}
{% assign jumboId = page.about-featured-image %}
{% if jumboId contains '/' %}
{% assign jumboSrc = jumboId | relative_url %}
{% else %}
{% assign jumboItem = site.data[site.metadata] | where: "objectid", jumboId | first %}
{% capture jumboSrc %}{{ jumboItem.object_location | default: jumboItem.image_small | relative_url }}{% endcapture %}
{%- endif -%}
<style>
#about-feature {
padding: 4rem 0;
margin-bottom: 1rem;
{% if page.about-featured-image %}
background-color: #e9ecef;
background-image: url({{ jumboSrc }});
background-size: cover;
background-repeat: no-repeat;
background-position: {{ page.position | default: 'center' }};{% endif %}
}
{% if page.padding %}
.about-title-box {
padding-top: {{ page.padding }};
padding-bottom: 1em;
}
{%- endif -%}
.about-title {
padding-left: 15% !important;
}
@media screen and (max-width: 576px) {
{% if page.padding %}
.about-title-box {
padding-top: min({{ page.padding }}, 45vh);
}{% endif %}
.about-title {
padding-left: 1rem !important;
}
}
</style>
<div id="about-feature">
<div class="about-title-box">
{% if page.heading or page.sub-heading %}
<div class="p-2 text-start text-white bg-dark bg-opacity-75 about-title">
{% if page.heading %}<h2 class="display-1">{{ page.heading }}</h2>{% endif %}
{% if page.sub-heading %}<h3 class="about-tagline h5">{{ page.sub-heading }}</h3>{% endif %}
</div>
{% endif %}
</div>
</div>
{% endif %}
<div id="about-wrapper">
<div id="about-toc-wrapper">
{% unless page.toc == false %}
<div id="about-toc">
<div id="about-toc-title">
<button class="btn btn-light" data-bs-toggle="collapse" data-bs-target="#about-toc-list" aria-expanded="false" aria-controls="about-toc-list">
Contents
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-chevron-down" viewBox="0 0 16 16">
<path fill-rule="evenodd" d="M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z"/>
</svg>
</button>
</div>
<div id="about-toc-list" class="collapse" >
{% include cb/jekyll-toc.html html=content sanitize=true h_min=1 h_max=3 skip_no_ids=true class="jekyll-toc-list" %}
</div>
</div>
{% endunless %}
</div>
<div id="about-contents-wrapper">
{{ content }}
</div>
</div>
<script>
document.addEventListener("DOMContentLoaded", function () {
const tocLinks = document.querySelectorAll("#about-toc-list a");
const headings = document.querySelectorAll("h1, h2, h3");
let activeId = null;
const observer = new IntersectionObserver(
entries => {
entries.forEach(entry => {
if (entry.isIntersecting) {
activeId = entry.target.id;
tocLinks.forEach(link => link.classList.remove("active"));
const activeLink = document.querySelector(
`#about-toc-list a[href="#${activeId}"]`
);
if (activeLink) {
activeLink.classList.add("active");
}
}
});
},
{
rootMargin: "-20% 0px -60% 0px",
threshold: 0
}
);
headings.forEach(heading => observer.observe(heading));
});
</script>

108
.github/_layouts/browse.html vendored Normal file
View File

@@ -0,0 +1,108 @@
---
layout: page
custom-foot: js/browse-js.html
---
{%- assign fields = site.data.config-browse -%}
<!-- Welcome Header and Description -->
{%- assign fields = site.data.config-browse -%}
<!-- Show the Welcome Text only on the Browse page -->
{% if page.url == '/browse/' %}
<div class="row mb-4">
<div class="col-lg-12 text-center">
<h1>welcome_to_the_archive</h1>
<p class="lead">Browse through materials from the archive by scrolling freely, or using the search bar to filter items by keywords in our archival metadata. You can use keywords like "pageant" or "Gary" to find people, events, locations, content types, or whatever you're looking for.</p>
<p class="small text-muted"><a href="/read/soakies/">Learn more about the materials within this archive ></a></p>
</div>
</div>
{% endif %}
<div class="row mb-2">
<div class="col-7 col-lg-9">{{ content }}</div>
<div class="col-5 col-lg-3 text-end text-lg-start">
{% if site.data.theme.advanced-search == true %}
{% include advanced-search-modal.html %}
{% endif %}
</div>
</div>
<div class="row mb-3 justify-content-center">
<div class="col-lg-8 text-center">
<form role="search" id="browseFilter" onsubmit="submitFilter(); return false;">
<div class="input-group input-group-lg">
{% if site.data.theme.faceted-search == true %}
<select class="form-control form-select d-none d-lg-block" id="fieldSelect" style="max-width: 200px;" aria-label="select search field to filter">
<option value="all">All Fields</option>
<option value="title">Title</option>
{% for f in fields %}
{% assign cap-field = f.field | capitalize %}
<option value="{{ f.field }}">{{ f.facet_name | default: f.display_name | default: cap-field }}</option>
{% endfor %}
<option value="display_template" data-bs-toggle="tooltip" title="The content type (e.g. image, video, document)">Content Type</option>
{% if site.data.theme.advanced-search == true %}
<option value="" disabled>─────────────</option>
<option value="advanced">Advanced Search...</option>
{% endif %}
</select>
<!-- Mobile filter button - shows only on small screens -->
<div class="{% if site.data.theme.faceted-search == true %}dropdown d-lg-none{% else %}d-none{% endif %}">
<button class="py-3 btn btn-outline-secondary" type="button" id="mobileFilterButton" data-bs-toggle="dropdown" aria-expanded="false" title="Filter options">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-funnel" viewBox="0 0 16 16">
<path d="M1.5 1.5A.5.5 0 0 1 2 1h12a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-.128.334L10 8.692V13.5a.5.5 0 0 1-.342.474l-3 1A.5.5 0 0 1 6 14.5V8.692L1.628 3.834A.5.5 0 0 1 1.5 3.5v-2zm1 .5v1.308l4.372 4.858A.5.5 0 0 1 7 8.5v5.306l2-.666V8.5a.5.5 0 0 1 .128-.334L13.5 3.308V2h-11z"/>
</svg>
<span id="selectedField" class="d-none d-sm-inline ms-1">All Fields</span>
</button>
<div class="dropdown-menu">
<button class="dropdown-item" type="button" data-field="all">All Fields</button>
<button class="dropdown-item" type="button" data-field="title">Title</button>
{% for f in fields %}
{% assign cap-field = f.field | capitalize %}
<button class="dropdown-item" type="button" data-field="{{ f.field }}">{{ f.facet_name | default: f.display_name | default: cap-field }}</button>
{% endfor %}
<button class="dropdown-item" type="button" data-field="display_template" data-bs-toggle="tooltip" title="The content type (e.g. image, video, document)">Content Type</button>
{% if site.data.theme.advanced-search == true %}
<div class="dropdown-divider"></div>
<button class="dropdown-item" type="button" data-field="advanced">Advanced Search...</button>
{% endif %}
</div>
</div>
{% endif %}
<input type="text" class="form-control" id="filterTextBox" placeholder="Filter ..." aria-label="Search">
<div id="dateRangeInputs" class="date-range-inputs">
<div class="date-input-group">
<input type="text" id="dateCreated" class="ms-2 form-control" placeholder="Enter Date (Text)">
</div>
</div>
<button class="btn btn-success" type="submit" title="Filter items" id="filterButton">Search</button>
<button class="btn btn-outline-secondary filter d-none d-lg-flex" onclick="resetFilter(); return false;" data-filter="">Reset</button>
</div>
</form>
</div>
<div class="col-lg-2">
<div class="dropdown">
<button class="btn btn-secondary mt-1 dropdown-toggle" type="button" id="browseSortButton" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
Sort by <span id="sortFilter">Random</span>
</button>
<div class="dropdown-menu browse-sort-menu" aria-labelledby="browseSortButton">
<button class="dropdown-item browse-sort-item {% if site.data.theme.default-sort-field == '' %}active{% endif %}" data-filter="random">Random</button>
<button class="dropdown-item browse-sort-item" data-filter="title">Title</button>
{% assign sort_options = site.data.config-browse | where_exp: 'i','i.sort_name != nil' %}
{% for o in sort_options %}
<button class="dropdown-item browse-sort-item" data-filter="{{ o.field | escape }}">{{ o.sort_name }}</button>
{% endfor %}
</div>
</div>
</div>
</div>
<!-- Active filter indicators -->
<div id="activeFilters" class="mt-2 text-start"></div>
<div class="h2" id="numberOf"></div>
<div id="loadingIcon" class="text-center">
<div class="spinner-border text-dark" role="status"><span class="visually-hidden">Loading...</span></div>
</div>
<div class="row" id="browseItems"></div>

32
.github/_layouts/cloud.html vendored Normal file
View File

@@ -0,0 +1,32 @@
---
# Term cloud layout
# used by default subjects and location page
# can be used for any metadata field cloud
layout: page
---
{{ content }}
{%- comment -%}
Figure out default "Subjects" and "Locations" page cloud values as configured in in "theme.yml",
and set default values for cloud include.
{%- endcomment -%}
{%- if page.cloud-fields == "site.data.theme.subjects-fields" -%}
{% assign fields = site.data.theme.subjects-fields %}
{% assign min = site.data.theme.subjects-min | default: 1 %}
{% assign stopwords = site.data.theme.subjects-stopwords %}
{%- elsif page.cloud-fields == "site.data.theme.locations-fields" -%}
{% assign fields = site.data.theme.locations-fields %}
{% assign min = site.data.theme.locations-min | default: 1 %}
{% assign stopwords = site.data.theme.locations-stopwords %}
{%- else -%}
{% assign fields = page.cloud-fields | default: "subjects" %}
{% assign min = page.cloud-min | default: 1 %}
{% assign stopwords = page.cloud-stopwords %}
{%- endif -%}
{% assign cloud_id = "cloud-div-" | append: fields | slugify %}
<div id="{{ cloud_id }}" class="text-center my-4 bg-{{ page.background | default: 'light' }} border rounded p-2"></div>
{% include js/cloud-js.html id=cloud_id fields=fields min=min stopwords=stopwords shuffle=page.shuffle button=page.button %}

14
.github/_layouts/data.html vendored Normal file
View File

@@ -0,0 +1,14 @@
---
# "Data" page with table and data download options
layout: page
custom-foot: js/table-js.html
---
{% assign fields = site.data.config-table | map: 'display_name' %}
{% include data-download-modal.html %}
{{ content }}
{% include data-table.html %}
</div>

17
.github/_layouts/default.html vendored Normal file
View File

@@ -0,0 +1,17 @@
<!doctype html>
<html lang="en" class="h-100">
<head prefix="og: http://ogp.me/ns#">
{% include head/head.html %}
</head>
<body class="d-flex flex-column h-100">
<div id="skip-to-content"><a href="#maincontent">Skip to main content</a></div>
{% include collection-banner.html %}
{% include collection-nav.html %}
<main id="maincontent" role="main" class="flex-shrink-0">
{{ content }}
</main>
{% include footer.html %}
{% include foot.html %}
{% include scroll-to-top.html %}
</body>
</html>

36
.github/_layouts/home-infographic.html vendored Normal file
View File

@@ -0,0 +1,36 @@
---
# Default home page with boxes providing collection stats
layout: page
---
<div class="row">
<div class="col-md-8">
<p class="section-label">Description</p>
{% include index/description.html %}
<p class="section-label mt-4">From The Archive</p>
{% include index/carousel.html %}
</div>
<div class="col-md-4">
<p class="section-label">Top Subjects</p>
{% include index/featured-terms.html field="subject" btn-color="primary" %}
<p class="section-label mt-4">Locations</p>
{% include index/featured-terms.html field="location" btn-color="outline-secondary" %}
<p class="section-label mt-4">Content</p>
{% include index/content.html %}
</div>
<div class="col-md-12 mt-4">
<p class="section-label">Collection as Data</p>
{% include index/data-download.html %}
</div>
</div>

25
.github/_layouts/item/audio.html vendored Normal file
View File

@@ -0,0 +1,25 @@
---
# audio item layout with audio player and thumb
# Uses <audio> element to embed audio file from object_location as src.
layout: item/item-page-base
---
<div class="card mb-4 text-center">
<div class="card-body">
{% include item/audio-player.html %}
<div class="mt-2">
{% include item/item-thumb.html %}
</div>
<div class="mt-2">
{% include item/download-buttons.html %}
</div>
</div>
</div>

View File

@@ -0,0 +1,18 @@
---
# basic layout for compound object items
# uses _includes/item/child/ includes to add multiple objects to the item page in a gallery
# each object is represented in a modal
layout: item/item-page-base
gallery: true
custom-foot: js/modal-hash-js.html
---
{% assign children = site.data[site.metadata] | where_exp: 'item','item.parentid == page.objectid' %}
<div class="mb-4 ">
{% include item/child/compound-item-modal-gallery.html %}
<div class="my-2">
{% include item/child/compound-item-download-buttons.html %}
</div>
</div>

19
.github/_layouts/item/image.html vendored Normal file
View File

@@ -0,0 +1,19 @@
---
# basic image item layout
# Displays image_small if available, with fall back to object_location.
# Adds gallery view to open images full screen using object_location, with fall back to image_small.
layout: item/item-page-base
gallery: true
---
<div class="card mb-4 text-center">
{% include item/image-gallery.html %}
<div class="card-body">
{% include item/download-buttons.html %}
</div>
</div>

View File

@@ -0,0 +1,46 @@
---
# base layout for other item display_template layouts
# adds breadcrumbs and title at top; citation box, rights box, and browse buttons at bottom
layout: default
# item-meta adds rich meta markup to the page on production build
item-meta: true
---
<div class="container py-3">
{% include item/breadcrumbs.html %}
<div class="my-0 h5 small">{{ page.display_template | replace: "_", " " | upcase }} {% if page.display_template == "compound_object" or page.display_template == "multiple" %}{% assign children = site.data[site.metadata] | where_exp: 'item','item.parentid == page.objectid' %} ({{ children | size }} Items){% endif %}</div>
<h2 class="mb-3">{{ page.title }}
{% unless page.display_template == 'record' %}<a href="#metadata" class="ms-5 btn btn-sm btn-outline-dark small">Item Info
<svg class="bi icon-sprite" role="img" aria-label="Jump to Item Info">
<use xlink:href="{{ '/assets/css/cb-icons.svg' | relative_url }}#arrow-down"/>
</svg>
</a>{% endunless %}
</h2>
<div class="row justify-content-center">
<div class="col-12 col-md-10">
{{ content }}
</div>
<div class="col-12 col-md-10" id="metadata">
{% include item/metadata.html %}
</div>
<div class="col-md-5 py-4">
{% include item/citation-box.html %}
</div>
{% if page.rights or page.rightsstatement %}
<div class="col-md-5 py-4">
{% include item/rights-box.html %}
</div>
{% endif %}
</div>
{%- if site.data.theme.browse-buttons == true -%}
{% include item/browse-buttons.html %}
{%- endif -%}
</div>

View File

@@ -0,0 +1,37 @@
---
# base layout for full page item display_template layouts
# adds breadcrumbs and title at top; citation box, rights box, and browse buttons at bottom
layout: default
# item-meta adds rich meta markup in HTML <head> element to the page on production build for better SEO
item-meta: true
---
{% if page.display_template == "compound_object" %}{% assign children = site.data[site.metadata] | where_exp: 'item','item.parentid == page.objectid' %}{% endif %}
<div class="container-fluid py-3">
{% include item/breadcrumbs.html %}
<div class="my-0 h5 small">{{ page.display_template | replace: "_", " " | upcase }} {% if page.display_template == "compound_object" %} ({{ children | size }} Items){% endif %}</div>
<h2 class="mb-3">{{ page.title }}
{% unless page.display_template == 'record' %}<a href="#metadata" class="ms-5 btn btn-sm btn-outline-dark small">Item Info
<svg class="bi icon-sprite" role="img" aria-label="Jump to Item Info">
<use xlink:href="{{ '/assets/css/cb-icons.svg' | relative_url }}#arrow-down"/>
</svg>
</a>{% endunless %}
</h2>
{{ content }}
<div class="row justify-content-end mt-4">
<div class="col-md-5">
{% include item/citation-box.html %}
</div>
{% if page.rights or page.rightsstatement %}
<div class="col-md-5">
{% include item/rights-box.html %}
</div>
{% endif %}
</div>
{%- if site.data.theme.browse-buttons == true -%}
{% include item/browse-buttons.html %}
{%- endif -%}
</div>

20
.github/_layouts/item/item.html vendored Normal file
View File

@@ -0,0 +1,20 @@
---
# generic fallback item page layout
# displays image or icon depending on "image_thumb"
layout: item/item-page-base
---
<div class="card mb-4 text-center">
<div class="card-body">
<p>
{% include item/item-thumb.html %}
</p>
<div class="mt-2">
{% include item/download-buttons.html %}
</div>
</div>
</div>

26
.github/_layouts/item/multiple.html vendored Normal file
View File

@@ -0,0 +1,26 @@
---
# layout for "multiple" display template
# creates large images with a gallery feature
layout: item/item-page-base
gallery: true
---
{% assign children = site.data[site.metadata] | where_exp: 'item','item.parentid == page.objectid' %}
<div class="mb-4 text-center">
{% for child in children %}
<div id="{{ child.objectid }}" class="mb-4">
<a class="spotlight gallery-img" {% if child.object_location %}data-download="true"{% endif %} title="{% if page.title != child.title %}{{ child.title | escape }}{% else %}{{ page.title | escape }} [{{ forloop.index }}]{% endif %}" href="{{ child.object_location | default: child.image_small | relative_url }}">
<img src="{{ child.image_small | relative_url }}" alt="{{ child.image_alt_text | default: child.description | default: child.title | default: page.title | escape }}" class="img-fluid mb-2">
{% if page.title != child.title %}<div><small class="text-dark">{{ child.title }}</small></div>{% endif %}
</a>
</div>
{% endfor %}
<div class="my-2">
{% include item/child/compound-item-download-buttons.html %}
</div>
</div>

17
.github/_layouts/item/panorama.html vendored Normal file
View File

@@ -0,0 +1,17 @@
---
# panorama item layout
# adds panorama viewer using Pannellum
layout: item/item-page-base
---
<div class="mb-4 text-center">
{% include item/panorama.html %}
<div class="my-2">
{% include item/download-buttons.html %}
</div>
</div>

20
.github/_layouts/item/pdf.html vendored Normal file
View File

@@ -0,0 +1,20 @@
---
# basic layout for PDF documents
# Displays image_small if available, with fall back to image_thumb, or a pdf icon.
layout: item/item-page-base
---
<div class="card mb-4 text-center">
<div class="card-body">
<p>
{% include item/item-thumb.html %}
</p>
<div class="mt-2">
{% include item/download-buttons.html %}
</div>
</div>
</div>

17
.github/_layouts/item/record.html vendored Normal file
View File

@@ -0,0 +1,17 @@
---
# basic layout intended for metadata only type item, designed for linking to external source
layout: item/item-page-base
---
<div class="mb-4 text-center">
{% if page.image_small or page.image_thumb %}
<p>
{% include item/item-thumb.html %}
</p>
{% endif %}
<div class="my-2">
{% include item/download-buttons.html %}
</div>
</div>

23
.github/_layouts/item/video.html vendored Normal file
View File

@@ -0,0 +1,23 @@
---
# basic video item layout
# Displays a video embedded on the page with default support for video files (using <video> element with object_location as src, MP4 is most compatible format), YouTube (from full link in object_location), or Vimeo videos (from full link in object_location).
layout: item/item-page-base
---
<div class="card mb-4 text-center">
<div class="card-body">
{% if page.object_location contains 'vimeo' or page.object_location contains 'youtu' %}
{% include item/video-embed.html %}
{% else %}
{% include item/video-player.html %}
{% endif %}
<div class="mt-2">
{% include item/download-buttons.html %}
</div>
</div>
</div>

20
.github/_layouts/map.html vendored Normal file
View File

@@ -0,0 +1,20 @@
---
# Default leaflet map page
layout: default
custom-foot: js/map-js.html
---
<div class="container map-page">
<header class="map-intro">
<h2>{{ page.title }}</h2>
<p>
Use this map to explore the locations of materials in the archive. Click on the markers to look at items associated with each location.
</p>
</header>
<div id="map"></div>
</div>
<div id="mapContainer"></div>

7
.github/_layouts/page-full-width.html vendored Normal file
View File

@@ -0,0 +1,7 @@
---
# Sets page in container-fluid to fill window with min gutter
layout: default
---
<div class="container-fluid my-4">
{{ content }}
</div>

10
.github/_layouts/page-narrow.html vendored Normal file
View File

@@ -0,0 +1,10 @@
---
# limits the content block to narrow size
# max-width is set in _pages.scss using .page-narrow selector
layout: default
---
<div class="container my-4">
<div class="page-narrow">
{{ content }}
</div>
</div>

7
.github/_layouts/page.html vendored Normal file
View File

@@ -0,0 +1,7 @@
---
# generic page layout
layout: default
---
<div class="container my-4">
{{ content }}
</div>

47
.github/_layouts/search.html vendored Normal file
View File

@@ -0,0 +1,47 @@
---
# Lunr search page
layout: page
custom-foot: js/lunr-js.html
---
{%- assign fields = site.data.config-search | where: 'index',true | map: 'field' -%}
<!-- Button trigger modal -->
<button type="button" class="btn btn-outline-primary float-end" data-bs-toggle="modal" data-bs-target="#operators">Search Options</button>
<!-- Modal -->
<div class="modal fade" id="operators" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="modalLabel">Lunr Search Options</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<p>These advanced options can be added to your query in the search box to refine your results:</p>
<ul>
<li>Search a specific field: use the field name, colon, then your query, e.g. <code>title:foo</code>, <code>date:1911</code>, <code>subject:tree</code>. In this collection you can use {{ fields | join: ", " }}.</li>
<li>Wildcards: add <code>*</code> to match any character(s), e.g. <code>foo*</code>, <code>*oo</code>. This is helpful for using a root to find words with all related endings.</li>
<li>Fuzzy match: add <code>~</code> plus a number at the end of your query to specify a higher level of fuzziness in search, e.g. <code>foo~1</code>. This can help with misspellings.</li>
<li>Boost term: add <code>^</code> plus a number to boost the relevance of a term in your query, e.g. <code>foo^10</code>. This can help reduce clutter of unrelated results if one of your terms is most important.</li>
</ul>
</div>
</div>
</div>
</div>
{{ content }}
<div class="ms-3 mt-3">
<form class="" role="search" id="lunrSearch" onsubmit="lunr_search(); return false;">
<div class="input-group input-group-lg">
<input id="lunrSearchBox" class="form-control " type="text" placeholder="Enter your search term..." >
<button class="btn btn-success" type="submit">
Search
</button>
</div>
</form>
<table id="lunrResults" class="table table-responsive"></table>
</div>
<div class="mt-3">
<p class="text-muted">Fuzzy search powered by <a href="https://lunrjs.com/">Lunr.js</a>. <em>May take a second to load large collections!</em></p>
</div>

74
.github/_layouts/timeline.html vendored Normal file
View File

@@ -0,0 +1,74 @@
---
# "Timeline" page
layout: page
custom-foot: js/timeline-js.html
---
{%- assign field = site.data.theme.timeline-field | default: page.timeline-field | default: "date" -%}
{% if site.data.theme.timeline-child-objects == true %}
{%- assign items = site.data[site.metadata] | where_exp: 'item','item.objectid' -%}
{% else %}
{%- assign items = site.data[site.metadata] | where_exp: 'item','item.objectid and item.parentid == nil' -%}
{% endif %}
{%- assign items = items | where_exp: 'item','item[field]' | sort: field -%}
{%- assign raw-dates = items | map: field | compact | uniq -%}
{%- capture clean-years -%}{% for date in raw-dates %}{% if date contains "-" %}{{ date | strip | split: "-" | first }}{% elsif date contains "/" %}{{ date | strip | split: "/" | last }}{% else %}{{ date | strip }}{% endif %}{% unless forloop.last %};{% endunless %}{%- endfor -%}{%- endcapture -%}
{%- assign uniqueYears = clean-years | replace: ";;",";" | split: ";" | compact | uniq | sort -%}
{%- if site.data.theme.year-navigation -%}
{%- assign navYears = site.data.theme.year-navigation | split: ";" -%}
{%- elsif site.data.theme.year-nav-increment -%}
{%- capture navYears -%}
{%- for i in uniqueYears -%}{%- assign t = i | modulo: site.data.theme.year-nav-increment -%}
{%- if t == 0 -%}{{ i }}{% unless forloop.last %};{% endunless %}{% endif %}{% endfor %}{%- endcapture -%}
{%- assign navYears = navYears | split: ";" -%}
{%- endif -%}
{%- if navYears -%}
<div class="dropdown float-end" id="year-nav">
<button class="btn btn-primary dropdown-toggle" type="button" id="yearButton" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
Year
</button>
<div class="dropdown-menu" aria-labelledby="yearButton">
{% for y in navYears %}
<a class="dropdown-item" href="#y{{ y }}">{{ y }}</a>{% endfor %}
</div>
</div>
{%- endif -%}
{{ content }}
<h3><a href="#y{{ uniqueYears | first }}">{{ uniqueYears | first }}</a> to <a href="#y{{ uniqueYears | last }}">{{ uniqueYears | last }}</a></h3>
<table id="timeline" class="table table-striped">
<tbody>
{% for year in uniqueYears %}
<tr id="y{{ year }}">
<th>
<h3>{{ year }}</h3>
</th>
<td>
<div class="row">
{%- assign inYear = items | where_exp: 'item', 'item[field] contains year' -%}
{% for item in inYear %}
<div class="col-lg-4 col-md-6">
<a href="{{ '/items/' | relative_url }}{% if item.parentid %}{{ item.parentid }}.html#{{ item.objectid }}{% else %}{{ item.objectid }}.html{% endif %}" >
{% if item.image_thumb %}
<img class="lazyload img-thumbnail timeline-thumb" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 3 2'%3E%3C/svg%3E" data-src="{{ item.image_thumb | relative_url }}" alt="{{ item.image_alt_text | default: item.description | default: item.title | escape }}" data-bs-toggle="tooltip" data-bs-placement="bottom" title="{{ item.title | escape }}">
{% else %}
<div class="card">
<div class="card-body text-center">
<div class="h5 text-dark">{{ item.title }}</div>
<svg class="bi timeline-thumb text-body" fill="currentColor" aria-hidden="true">
{%- assign icon_template = item.display_template | default: item.format -%}
<use xlink:href="{{ '/assets/css/cb-icons.svg' | relative_url }}#{% if icon_template contains 'image' %}icon-image{% elsif icon_template contains 'pdf' %}icon-pdf{% elsif icon_template contains 'audio' %}icon-audio{% elsif icon_template contains 'video' %}icon-video{% elsif icon_template contains 'panorama' %}icon-panorama{% elsif icon_template contains 'compound' %}icon-compound-object{% elsif icon_template contains 'multiple' %}icon-multiple{% else %}icon-default{% endif %}"/>
</svg>
</div>
</div>
{% endif %}
</a>
</div>
{% endfor %}
</div>
</td>
</tr>
{% endfor %}
</tbody>
</table>