add editorconfig and convert spaces to tabs

This commit is contained in:
2026-01-07 14:42:15 -08:00
parent 648234959f
commit c7b2134ea8
19 changed files with 969 additions and 951 deletions

View File

@ -1,86 +1,86 @@
const makeArtistImg = function(artistImg) {
let imgDiv = document.createElement("div");
imgDiv.classList.add("fit-contain");
let imgDiv = document.createElement("div");
imgDiv.classList.add("fit-contain");
let img = document.createElement("img");
img.src = artistImg.src;
let img = document.createElement("img");
img.src = artistImg.src;
/* handle single-line or multi-line alts */
if (typeof artistImg.alt === "string") img.alt = artistImg.alt;
else {
let fullAlt = `a ${artistImg.alt.length} image collage.`
for (let i = 0; i < artistImg.alt.length; i++)
fullAlt += ` ${i}: ${artistImg.alt[i]}`
img.alt = fullAlt;
}
/* handle single-line or multi-line alts */
if (typeof artistImg.alt === "string") img.alt = artistImg.alt;
else {
let fullAlt = `a ${artistImg.alt.length} image collage.`
for (let i = 0; i < artistImg.alt.length; i++)
fullAlt += ` ${i}: ${artistImg.alt[i]}`
img.alt = fullAlt;
}
imgDiv.append(img);
return imgDiv;
imgDiv.append(img);
return imgDiv;
}
const makeArtistDesc = function(bio, contact) {
let descDiv = document.createElement("div");
descDiv.classList.add("description");
let descDiv = document.createElement("div");
descDiv.classList.add("description");
/* multi-line bio array */
for (const bioLine of bio) {
let p = document.createElement("p");
p.innerHTML = bioLine;
descDiv.append(p);
}
/* multi-line bio array */
for (const bioLine of bio) {
let p = document.createElement("p");
p.innerHTML = bioLine;
descDiv.append(p);
}
/* artist contact info */
let contacts = document.createElement("p");
for (let i = 0; i < contact.length; i++) {
let a = document.createElement("a");
a.href = contact[i].href;
a.innerHTML = contact[i].title;
a.target = "_blank";
contacts.append(a);
/* artist contact info */
let contacts = document.createElement("p");
for (let i = 0; i < contact.length; i++) {
let a = document.createElement("a");
a.href = contact[i].href;
a.innerHTML = contact[i].title;
a.target = "_blank";
contacts.append(a);
if (i !== contact.length - 1) contacts.append(" ● ");
}
descDiv.append(contacts);
if (i !== contact.length - 1) contacts.append(" ● ");
}
descDiv.append(contacts);
return descDiv;
return descDiv;
}
const makeArtist = function(artist) {
let container = document.createElement("div");
container.classList.add("artist");
container.id = artist.id;
let container = document.createElement("div");
container.classList.add("artist");
container.id = artist.id;
/* artist img */
container.append(makeArtistImg(artist.img));
/* artist img */
container.append(makeArtistImg(artist.img));
/* artist name */
let h3 = document.createElement("h3");
h3.innerHTML = artist.name;
container.append(h3);
/* artist name */
let h3 = document.createElement("h3");
h3.innerHTML = artist.name;
container.append(h3);
/* artist description */
container.append(makeArtistDesc(artist.bio, artist.contact));
return container;
/* artist description */
container.append(makeArtistDesc(artist.bio, artist.contact));
return container;
}
let artistContainer = document.getElementById("artists");
const makeArtistPage = function(artists) {
for (const artist of artists)
artistContainer.append(makeArtist(artist));
for (const artist of artists)
artistContainer.append(makeArtist(artist));
}
let script = document.currentScript;
let artistsfile = script.dataset.artists;
fetch(artistsfile)
.then((response) => {
if (!response.ok) {
throw new Error(`HTTP error, status = ${response.status}`);
}
return response.json();
})
.then((artists) => makeArtistPage(artists))
.catch((error) => {
console.log(`Error: ${error.message}`);
});
.then((response) => {
if (!response.ok) {
throw new Error(`HTTP error, status = ${response.status}`);
}
return response.json();
})
.then((artists) => makeArtistPage(artists))
.catch((error) => {
console.log(`Error: ${error.message}`);
});

View File

@ -1,76 +1,76 @@
/* Top nav */
const navItems = [
{
href: "/about/",
title: "ⓘ about",
tooltip: "about the Beall Greenhouses"
},
{
href: "/events/",
title: "🗓 events",
tooltip: "events at the Beall Greenhouses"
},
{
href: "/artists/",
title: "🖌 artists",
tooltip: "artists in residence at the Beall Greenhouses"
}
{
href: "/about/",
title: "ⓘ about",
tooltip: "about the Beall Greenhouses"
},
{
href: "/events/",
title: "🗓 events",
tooltip: "events at the Beall Greenhouses"
},
{
href: "/artists/",
title: "🖌 artists",
tooltip: "artists in residence at the Beall Greenhouses"
}
];
const createMenuLink = function(title, href, tooltip) {
let path = window.location.pathname;
let path = window.location.pathname;
let a = document.createElement("a");
a.href = href;
a.innerHTML = title;
a.title = tooltip;
a.ariaLabel = tooltip;
if (href === "#main") a.id = "skip";
else if (href === path) a.id = "current-page";
let a = document.createElement("a");
a.href = href;
a.innerHTML = title;
a.title = tooltip;
a.ariaLabel = tooltip;
if (href === "#main") a.id = "skip";
else if (href === path) a.id = "current-page";
return a;
return a;
}
const createHomeLink = function() {
let path = window.location.pathname;
let path = window.location.pathname;
let a = document.createElement("a");
a.href = "/";
a.ariaLabel = "Beall Greenhouses home";
if (path === "/") {
a.id = "current-page";
a.title = "Beall Greenhouses home";
} else {
a.title = "↩ Beall Greenhouses home"
}
let a = document.createElement("a");
a.href = "/";
a.ariaLabel = "Beall Greenhouses home";
if (path === "/") {
a.id = "current-page";
a.title = "Beall Greenhouses home";
} else {
a.title = "↩ Beall Greenhouses home"
}
let logo = document.createElement("img");
logo.src = "/assets/img/logo.jpg";
logo.alt = "block print in black and orange of a rufous hummingbird in flight with tail flared. the hummingbird holds a banner that reads 'become ungovernable.'"
let logo = document.createElement("img");
logo.src = "/assets/img/logo.jpg";
logo.alt = "block print in black and orange of a rufous hummingbird in flight with tail flared. the hummingbird holds a banner that reads 'become ungovernable.'"
a.append(logo);
a.append(logo);
return a;
return a;
}
const createNav = function() {
let nav = document.createElement("nav");
nav.title = "background image shows the peak of a dilapidated greenhouse in black and white";
let nav = document.createElement("nav");
nav.title = "background image shows the peak of a dilapidated greenhouse in black and white";
nav.append(createMenuLink("skip ↷", "#main", "skip to main content"));
nav.append(createHomeLink());
nav.append(createMenuLink("skip ↷", "#main", "skip to main content"));
nav.append(createHomeLink());
let ul = document.createElement("ul");
let ul = document.createElement("ul");
for (const item of navItems) {
let li = document.createElement("li");
li.append(createMenuLink(item.title, item.href, item.tooltip));
ul.append(li);
}
for (const item of navItems) {
let li = document.createElement("li");
li.append(createMenuLink(item.title, item.href, item.tooltip));
ul.append(li);
}
nav.append(ul);
nav.append(ul);
return nav;
return nav;
}
let header = document.querySelector("header");
@ -78,15 +78,15 @@ header.append(createNav());
/* Footer */
const footerHTML = `
<p>questions?
<a href="mailto:beall.greenhouses@gmail.com">email us!</a>
</p>
<p>brought to you in 2026</p>
<p>questions?
<a href="mailto:beall.greenhouses@gmail.com">email us!</a>
</p>
<p>brought to you in 2026</p>
`
const populateFooter = function() {
let footer = document.getElementById("footer");
footer.innerHTML = footerHTML;
let footer = document.getElementById("footer");
footer.innerHTML = footerHTML;
}
populateFooter();

View File

@ -1,99 +1,99 @@
.artist {
width: 100%;
margin: 2rem 0;
display: grid;
scroll-margin-top: 1rem;
width: 100%;
margin: 2rem 0;
display: grid;
scroll-margin-top: 1rem;
}
.artist:nth-child(odd) {
grid-template:
'imgs h3'
'imgs desc'
'imgs .';
grid-template-columns: 45% auto;
grid-template:
'imgs h3'
'imgs desc'
'imgs .';
grid-template-columns: 45% auto;
}
.artist:nth-child(even) {
grid-template:
'h3 imgs'
'desc imgs'
'. imgs';
grid-template-columns: auto 45%;
grid-template:
'h3 imgs'
'desc imgs'
'. imgs';
grid-template-columns: auto 45%;
}
@media (max-width: 1050px) {
.artist:nth-child(n) {
grid-template:
'imgs'
'h3'
'desc';
}
.artist:nth-child(n) {
grid-template:
'imgs'
'h3'
'desc';
}
}
.fit-contain {
object-fit: contain;
grid-area: imgs;
object-fit: contain;
grid-area: imgs;
}
.artist img {
max-height: 100%;
max-width: 100%;
border-radius: 1rem;
max-height: 100%;
max-width: 100%;
border-radius: 1rem;
}
@media (max-width: 1050px) {
.artist img {
border-radius: 1rem 1rem 0 0;
border-bottom: .25rem solid var(--color-accent);
}
.artist img {
border-radius: 1rem 1rem 0 0;
border-bottom: .25rem solid var(--color-accent);
}
}
.artist h3 {
grid-area: h3;
text-transform: uppercase;
line-height: 2rem;
grid-area: h3;
text-transform: uppercase;
line-height: 2rem;
}
.artist:nth-child(odd) h3 {
padding-left: .5rem;
padding-left: .5rem;
}
.artist:nth-child(even) h3 {
padding-right: .5rem;
text-align: right;
padding-right: .5rem;
text-align: right;
}
@media (max-width: 1050px) {
.artist:nth-child(n) h3 {
padding: 0;
}
.artist:nth-child(n) h3 {
padding: 0;
}
}
.description {
grid-area: desc;
background-color: var(--color-bg-alt);
border-radius: 0 0 1rem 1rem;
grid-area: desc;
background-color: var(--color-bg-alt);
border-radius: 0 0 1rem 1rem;
}
.artist:nth-child(odd) .description {
margin-left: 1.75rem;
margin-left: 1.75rem;
}
.artist:nth-child(even) .description {
margin-right: 1.75rem;
margin-right: 1.75rem;
}
@media (max-width: 750px) {
.artist:nth-child(odd) .description {
margin-left: .875rem;
}
.artist:nth-child(odd) .description {
margin-left: .875rem;
}
.artist:nth-child(even) .description {
margin-right: .875rem;
}
.artist:nth-child(even) .description {
margin-right: .875rem;
}
}
.description p:last-child {
text-align: center;
padding-bottom: 1rem;
text-align: center;
padding-bottom: 1rem;
}

View File

@ -1,61 +1,61 @@
.resident {
margin: 2rem auto;
display: grid;
grid-template:
'img h1'
'img desc'
'img .';
grid-template-columns: 1fr 1fr;
margin: 2rem auto;
display: grid;
grid-template:
'img h1'
'img desc'
'img .';
grid-template-columns: 1fr 1fr;
}
@media (max-width: 1050px) {
.resident {
grid-template:
'img'
'h1'
'desc';
}
.resident {
grid-template:
'img'
'h1'
'desc';
}
}
.resident h1 {
grid-area: h1;
font-size: 2rem;
margin: 0;
border-bottom: .25rem solid var(--color-accent);
grid-area: h1;
font-size: 2rem;
margin: 0;
border-bottom: .25rem solid var(--color-accent);
}
.resident img {
grid-area: img;
border-radius: 1rem;
grid-area: img;
border-radius: 1rem;
}
.resident #bio {
grid-area: desc;
margin-left: 1.75rem;
grid-area: desc;
margin-left: 1.75rem;
}
@media (max-width: 1050px) {
.resident img {
border-radius: 1rem 1rem 0 0;
border-bottom: .25rem solid var(--color-accent);
}
.resident img {
border-radius: 1rem 1rem 0 0;
border-bottom: .25rem solid var(--color-accent);
}
.resident #bio {
margin: 0;
}
.resident #bio {
margin: 0;
}
}
.resident #bio,
.contact ul {
background-color: var(--color-bg-alt);
border-radius: 0 0 1rem 1rem;
background-color: var(--color-bg-alt);
border-radius: 0 0 1rem 1rem;
}
.contact {
margin-top: 4rem;
text-align: center;
margin-top: 4rem;
text-align: center;
}
.contact li {
list-style: none;
list-style: none;
}

View File

@ -1,61 +1,61 @@
#directory {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 3rem;
margin: 0 .5rem;
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 3rem;
margin: 0 .5rem;
}
@media (max-width: 1050px) {
#directory {
grid-template-columns: 1fr;
}
#directory {
grid-template-columns: 1fr;
}
}
ul#directory,
ol#directory {
background-color: var(--color-bg);
padding: 0;
background-color: var(--color-bg);
padding: 0;
}
#directory li {
list-style: none;
border: solid .25rem var(--color-accent);
border-radius: .75rem;
outline-offset: .25rem;
margin: 0;
padding: 0;
list-style: none;
border: solid .25rem var(--color-accent);
border-radius: .75rem;
outline-offset: .25rem;
margin: 0;
padding: 0;
}
@media (any-hover: hover) {
#directory li:hover {
background-color: var(--color-text);
}
#directory li:hover {
background-color: var(--color-text);
}
#directory li:hover h2 {
color: var(--color-bg);
border-color: var(--color-accent-flipped);
}
#directory li:hover h2 {
color: var(--color-bg);
border-color: var(--color-accent-flipped);
}
}
#directory li:focus-within {
outline: solid .25rem var(--color-accent);
outline: solid .25rem var(--color-accent);
}
#directory a {
text-decoration: none;
margin: 0;
text-decoration: none;
margin: 0;
}
#directory a:focus-visible {
outline: none; /* outline handled by li:focus-within */
outline: none; /* outline handled by li:focus-within */
}
#directory h2 {
text-align: center;
margin-top: 1rem;
text-align: center;
margin-top: 1rem;
}
#directory img {
margin: 0;
border-radius: 0 0 .5rem .5rem;
margin: 0;
border-radius: 0 0 .5rem .5rem;
}

View File

@ -1,177 +1,177 @@
:root {
color-scheme: light dark;
color-scheme: light dark;
--color-concrete: #e5e0c7;
--color-concrete-alt: #d1cbab;
--color-green: #142b15;
--color-green-alt: #1a3b1b;
--color-teal-light: #4ba19e;
--color-teal-dark: #0c6a74;
--color-concrete: #e5e0c7;
--color-concrete-alt: #d1cbab;
--color-green: #142b15;
--color-green-alt: #1a3b1b;
--color-teal-light: #4ba19e;
--color-teal-dark: #0c6a74;
--color-bg: light-dark(var(--color-concrete), var(--color-green));
--color-text: light-dark(var(--color-green), var(--color-concrete));
--color-bg-alt: light-dark(var(--color-concrete-alt), var(--color-green-alt));
--color-text-alt: light-dark(var(--color-green-alt), var(--color-concrete-alt));
--color-accent: light-dark(var(--color-teal-dark), var(--color-teal-light));
--color-accent-flipped: light-dark(var(--color-teal-light), var(--color-teal-dark));
--color-bg: light-dark(var(--color-concrete), var(--color-green));
--color-text: light-dark(var(--color-green), var(--color-concrete));
--color-bg-alt: light-dark(var(--color-concrete-alt), var(--color-green-alt));
--color-text-alt: light-dark(var(--color-green-alt), var(--color-concrete-alt));
--color-accent: light-dark(var(--color-teal-dark), var(--color-teal-light));
--color-accent-flipped: light-dark(var(--color-teal-light), var(--color-teal-dark));
}
* {
box-sizing: border-box;
margin: 0;
padding: 0;
box-sizing: border-box;
margin: 0;
padding: 0;
}
body {
background-color: var(--color-text);
color: var(--color-bg);
display: flex;
flex-direction: column;
font-family: sans-serif;
min-height: 100vh;
background-color: var(--color-text);
color: var(--color-bg);
display: flex;
flex-direction: column;
font-family: sans-serif;
min-height: 100vh;
}
#content {
background-color: var(--color-bg);
color: var(--color-text);
width: 100%;
flex-grow: 1;
border-radius: 0 0 2rem 2rem;
padding: 1rem 0 2rem;
background-color: var(--color-bg);
color: var(--color-text);
width: 100%;
flex-grow: 1;
border-radius: 0 0 2rem 2rem;
padding: 1rem 0 2rem;
}
@media (prefers-color-scheme: light) {
.dark-mode {
display: none;
}
.dark-mode {
display: none;
}
}
@media (prefers-color-scheme: dark) {
.light-mode {
display: none;
}
.light-mode {
display: none;
}
}
header,
main {
width: 65%;
margin: 0 auto 1rem;
width: 65%;
margin: 0 auto 1rem;
}
@media (max-width: 750px) {
header,
main {
width: 92%;
}
header,
main {
width: 92%;
}
}
@media (min-width: 2000px) {
header,
main {
width: 45%;
}
header,
main {
width: 45%;
}
}
img {
display: block;
max-width: 100%;
display: block;
max-width: 100%;
}
h1, h2, h3, h4, h5, h6 {
color: var(--color-text-alt);
color: var(--color-text-alt);
}
h1,
h2 {
font-family: 'Bellota', sans-serif;
font-family: 'Bellota', sans-serif;
}
h1 {
text-align: center;
margin: 2rem 0;
font-size: 2.2rem;
text-align: center;
margin: 2rem 0;
font-size: 2.2rem;
}
h2 {
margin: 2rem 0 0;
font-size: 1.65rem;
margin: 2rem 0 0;
font-size: 1.65rem;
}
h2,
h3 {
border-bottom: .25rem solid var(--color-accent);
border-bottom: .25rem solid var(--color-accent);
}
a {
color: var(--color-text);
font-weight: bold;
text-decoration: underline;
text-decoration-style: solid;
text-decoration-thickness: .25rem;
text-decoration-color: var(--color-accent);
transition: text-decoration-thickness .5s;
margin: 0 .25rem;
border-radius: .1rem;
outline-offset: .1rem;
color: var(--color-text);
font-weight: bold;
text-decoration: underline;
text-decoration-style: solid;
text-decoration-thickness: .25rem;
text-decoration-color: var(--color-accent);
transition: text-decoration-thickness .5s;
margin: 0 .25rem;
border-radius: .1rem;
outline-offset: .1rem;
}
a:hover,
a:active {
text-decoration-thickness: .5rem;
text-decoration-thickness: .5rem;
}
a:focus-visible {
text-decoration: none;
outline: solid .25rem var(--color-accent);
text-decoration: none;
outline: solid .25rem var(--color-accent);
}
main p,
main ul {
padding: .8rem;
line-height: 1.5rem;
padding: .8rem;
line-height: 1.5rem;
}
main li {
margin-left: 1rem;
margin-left: 1rem;
}
main li:not(:last-child) {
padding: 0 0 .5rem;
padding: 0 0 .5rem;
}
/* styles for sets of <p>s under an h2/3/etc vs alone */
.under-header,
.no-header {
background-color: var(--color-bg-alt);
background-color: var(--color-bg-alt);
}
.under-header {
border-radius: 0 0 1rem 1rem;
margin-left: 2.5rem;
border-radius: 0 0 1rem 1rem;
margin-left: 2.5rem;
}
@media (max-width: 750px) {
.under-header {
margin-left: 1.25rem;
}
.under-header {
margin-left: 1.25rem;
}
}
.no-header {
border-radius: 1rem;
border-radius: 1rem;
}
.two-col {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 1rem;
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 1rem;
}
.two-col > * {
place-self: start center;
place-self: start center;
}
@media (max-width: 750px) {
.two-col {
grid-template-columns: 1fr;
}
.two-col {
grid-template-columns: 1fr;
}
}

View File

@ -1,43 +1,43 @@
/* top nav */
nav {
position: relative;
margin: 0 auto 1.5rem;
display: flex;
justify-content: space-between;
align-items: flex-start;
background-image: url("/assets/img/greenhouse.jpg");
background-size: cover;
background-repeat: no-repeat;
border-radius: 2rem .25rem .25rem 2rem;
position: relative;
margin: 0 auto 1.5rem;
display: flex;
justify-content: space-between;
align-items: flex-start;
background-image: url("/assets/img/greenhouse.jpg");
background-size: cover;
background-repeat: no-repeat;
border-radius: 2rem .25rem .25rem 2rem;
}
nav a {
margin: 0;
margin: 0;
}
nav a:not(:has(img)) {
display: inline-block;
text-decoration: none;
font-size: 1.2rem;
padding: 0 .25rem;
border: solid .125rem var(--color-accent);
border-radius: .25rem;
background-color: var(--color-bg);
display: inline-block;
text-decoration: none;
font-size: 1.2rem;
padding: 0 .25rem;
border: solid .125rem var(--color-accent);
border-radius: .25rem;
background-color: var(--color-bg);
}
@media (any-hover: hover) {
nav a:not(:has(img)):hover {
color: var(--color-bg);
background-color: var(--color-text-alt);
border-color: var(--color-accent-flipped);
outline: .125rem solid var(--color-accent);
outline-offset: 0;
}
nav a:not(:has(img)):hover {
color: var(--color-bg);
background-color: var(--color-text-alt);
border-color: var(--color-accent-flipped);
outline: .125rem solid var(--color-accent);
outline-offset: 0;
}
}
nav a:not(:has(img)):focus-visible {
outline: solid .125rem var(--color-accent);
outline-offset: .125rem;
outline: solid .125rem var(--color-accent);
outline-offset: .125rem;
}
#skip {
@ -59,69 +59,69 @@ nav a:not(:has(img)):focus-visible {
}
@media (max-width: 750px) {
#skip:focus-visible {
left: 5rem;
}
#skip:focus-visible {
left: 5rem;
}
}
nav img {
max-height: 6.75rem;
max-width: 100%;
margin: 0 auto;
border-radius: 2rem;
border: .2rem solid var(--color-accent);
max-height: 6.75rem;
max-width: 100%;
margin: 0 auto;
border-radius: 2rem;
border: .2rem solid var(--color-accent);
}
@media (any-hover: hover) {
nav img:hover {
border-color: var(--color-accent-flipped);
outline-offset: 0;
outline: .2rem solid var(--color-accent);
}
nav img:hover {
border-color: var(--color-accent-flipped);
outline-offset: 0;
outline: .2rem solid var(--color-accent);
}
}
nav a:has(img):focus {
border-radius: 2rem;
outline-offset: .2rem;
outline: .2rem solid var(--color-accent);
border-radius: 2rem;
outline-offset: .2rem;
outline: .2rem solid var(--color-accent);
}
nav a:has(img):focus img {
outline: none;
outline: none;
}
nav ul {
display: flex;
justify-content: flex-end;
gap: .6rem;
align-items: flex-end;
flex-flow: column nowrap;
display: flex;
justify-content: flex-end;
gap: .6rem;
align-items: flex-end;
flex-flow: column nowrap;
}
nav li {
list-style: none;
list-style: none;
}
/* footer */
footer {
width: 95%;
margin: 0 auto;
padding: 1rem 0;
width: 95%;
margin: 0 auto;
padding: 1rem 0;
}
footer p {
background-color: var(--color-text);
color: var(--color-bg);
text-align: center;
font-size: .9rem;
padding: .25rem;
background-color: var(--color-text);
color: var(--color-bg);
text-align: center;
font-size: .9rem;
padding: .25rem;
}
footer a {
color: var(--color-bg);
text-decoration-color: var(--color-accent-flipped);
color: var(--color-bg);
text-decoration-color: var(--color-accent-flipped);
}
footer a:focus-visible {
outline-color: var(--color-accent-flipped);
outline-color: var(--color-accent-flipped);
}