Initial commit

This commit is contained in:
Nasir Anthony Montalvo
2025-11-13 14:48:58 -06:00
committed by GitHub
commit 526096840e
2349 changed files with 19464 additions and 0 deletions

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 %}

86
_layouts/about.html Normal file
View File

@@ -0,0 +1,86 @@
---
# 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" credits=page.credits %}
</div>
</div>
{% endunless %}
</div>
<div id="about-contents-wrapper">
{{ content }}
</div>
{% if page.credits == true %}
<div id="credits-contents-wrapper">
{% include cb/credits.html %}
</div>
{% endif %}
</div>

91
_layouts/browse.html Normal file
View File

@@ -0,0 +1,91 @@
---
# collection "Browse" page
layout: page
custom-foot: js/browse-js.html
---
{%- assign fields = site.data.config-browse -%}
<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">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">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">
<!-- Update the date range inputs section -->
<div id="dateRangeInputs" class="date-range-inputs">
<div class="date-input-group">
<input type="text" id="startDate" class="ms-2 form-control" placeholder="Start Date">
<span class="date-separator">to</span>
<input type="text" id="endDate" class="me-2 form-control" placeholder="End Date">
</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>
<!-- Active filter indicators -->
<div id="activeFilters" class="mt-2 text-start"></div>
<div class="h2" id="numberOf"></div>
</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>
<button class="btn btn-outline-secondary filter p-1 d-lg-none float-end" onclick="resetFilter(); return false;" data-filter="">Reset</button>
</div>
</div>
</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
_layouts/cloud.html 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 %}

23
_layouts/data.html Normal file
View File

@@ -0,0 +1,23 @@
---
# "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 }}
<div class="table-responsive-md">
<table id="item-table" class="table table-striped">
<thead>
<tr>
{% for f in fields %}
<th scope="col">{{ f }}</th>
{% endfor %}
<th>Link</th>
</tr>
</thead>
</table>
</div>

17
_layouts/default.html 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>

View File

@@ -0,0 +1,30 @@
---
# Default home page with boxes providing collection stats
layout: page
---
<div class="row">
<div class="col-md-8">
{% include index/description.html %}
{% include index/carousel.html title="Sample Items" %}
</div>
<div class="col-md-4">
{% include index/time.html %}
{% include index/featured-terms.html field="subject" title="Top Subjects" btn-color="primary" %}
{% include index/featured-terms.html field="location" title="Locations" btn-color="outline-secondary" %}
{% include index/content.html %}
</div>
<div class="col-md-12">
{% include index/data-download.html %}
</div>
</div>

25
_layouts/item/audio.html 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
_layouts/item/image.html 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
_layouts/item/item.html 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>

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>

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
_layouts/item/pdf.html 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
_layouts/item/record.html 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
_layouts/item/video.html 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>

7
_layouts/map.html Normal file
View File

@@ -0,0 +1,7 @@
---
# Default leaflet map page
layout: default
custom-foot: js/map-js.html
---
<h2 class="visually-hidden">Map of Collection Items</h2>
<div id="mapContainer"></div>

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
_layouts/page-narrow.html 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
_layouts/page.html Normal file
View File

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

47
_layouts/search.html 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
_layouts/timeline.html 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>