10 Commits

Author SHA1 Message Date
b85247d8b4 Fix missing prose styles in production by converting Tailwind config to JS
The production Docker build (node:22-alpine) was failing to load the
TypeScript Tailwind config via jiti, causing Tailwind to silently fall
back to a default config with no plugins. This meant the
@tailwindcss/typography plugin never ran, so no .prose CSS rules were
generated. Tailwind's preflight reset (p { margin: 0 }) was still
applied with nothing to override it, making all blog post paragraphs
run together with zero spacing.

Converting tailwind.config.ts and typography.ts to plain JS files
removes the dependency on jiti for config loading. Also adds .mdx to
the Tailwind content glob so utility classes used directly in MDX files
(not-prose, flex, etc.) are included in the production CSS.
2026-04-02 21:09:53 -07:00
db31ef84cf Replace Endurance image 2026-04-02 21:08:00 -07:00
54bc09a082 Add blog post about Endurance screening
Some checks failed
Build Production Image / Build Production Image (push) Failing after 3m40s
2026-04-02 20:18:46 -07:00
809874471a Center the mailing list captcha
Some checks failed
Build Production Image / Build Production Image (push) Failing after 3m27s
2025-11-11 10:19:51 -08:00
530ad0ccff Add padding to mailing list inputs 2025-11-11 10:19:42 -08:00
563c4725f2 Add mailing address to footer 2025-11-11 10:19:16 -08:00
fd8b2336ef Switch to bundled altcha
All checks were successful
Build Production Image / Build Production Image (push) Successful in 2m21s
2025-11-03 18:38:40 -08:00
fa89e86a2f Update board of directors positions 2025-11-03 18:37:14 -08:00
29ffaca0f7 Upgrade to node 22
Some checks failed
Build Production Image / Build Production Image (push) Failing after 3m9s
2025-09-20 15:09:36 -07:00
58a0260ebb Switch to altcha for listmonk 2025-09-20 15:09:22 -07:00
10 changed files with 130 additions and 24 deletions

View File

@@ -1,4 +1,4 @@
FROM docker.io/library/node:18-alpine AS build-env
FROM docker.io/library/node:22-alpine AS build-env
ENV NODE_ENV=production
ENV PORT=3000

52
package-lock.json generated
View File

@@ -22,6 +22,7 @@
"@types/react": "18.2.18",
"@types/react-dom": "18.2.7",
"@types/webpack-env": "^1.18.1",
"altcha": "2.2.3",
"autoprefixer": "^10.4.12",
"cheerio": "^1.0.0-rc.12",
"clsx": "^1.2.1",
@@ -67,6 +68,12 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/@altcha/crypto": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/@altcha/crypto/-/crypto-0.0.1.tgz",
"integrity": "sha512-qZMdnoD3lAyvfSUMNtC2adRi666Pxdcw9zqfMU5qBOaJWqpN9K+eqQGWqeiKDMqL0SF+EytNG4kR/Pr/99GJ6g==",
"license": "MIT"
},
"node_modules/@babel/runtime": {
"version": "7.22.6",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz",
@@ -559,6 +566,19 @@
"url": "https://opencollective.com/unts"
}
},
"node_modules/@rollup/rollup-linux-x64-gnu": {
"version": "4.18.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz",
"integrity": "sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==",
"cpu": [
"x64"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rushstack/eslint-patch": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.3.2.tgz",
@@ -1143,6 +1163,18 @@
"ajv": "^6.9.1"
}
},
"node_modules/altcha": {
"version": "2.2.3",
"resolved": "https://registry.npmjs.org/altcha/-/altcha-2.2.3.tgz",
"integrity": "sha512-LcGCNTOYtkcRthJgFU5ycgVE6ffcp3/WMSrAMri/UN+WcBEwfzb0RnUmhWee9VA52cHUL9ONeQsrE/zCkUoZiQ==",
"license": "MIT",
"dependencies": {
"@altcha/crypto": "^0.0.1"
},
"optionalDependencies": {
"@rollup/rollup-linux-x64-gnu": "4.18.0"
}
},
"node_modules/ansi-align": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz",
@@ -10550,6 +10582,11 @@
"resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
"integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw=="
},
"@altcha/crypto": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/@altcha/crypto/-/crypto-0.0.1.tgz",
"integrity": "sha512-qZMdnoD3lAyvfSUMNtC2adRi666Pxdcw9zqfMU5qBOaJWqpN9K+eqQGWqeiKDMqL0SF+EytNG4kR/Pr/99GJ6g=="
},
"@babel/runtime": {
"version": "7.22.6",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz",
@@ -10864,6 +10901,12 @@
"tslib": "^2.6.0"
}
},
"@rollup/rollup-linux-x64-gnu": {
"version": "4.18.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz",
"integrity": "sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==",
"optional": true
},
"@rushstack/eslint-patch": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.3.2.tgz",
@@ -11354,6 +11397,15 @@
"peer": true,
"requires": {}
},
"altcha": {
"version": "2.2.3",
"resolved": "https://registry.npmjs.org/altcha/-/altcha-2.2.3.tgz",
"integrity": "sha512-LcGCNTOYtkcRthJgFU5ycgVE6ffcp3/WMSrAMri/UN+WcBEwfzb0RnUmhWee9VA52cHUL9ONeQsrE/zCkUoZiQ==",
"requires": {
"@altcha/crypto": "^0.0.1",
"@rollup/rollup-linux-x64-gnu": "4.18.0"
}
},
"ansi-align": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz",

View File

@@ -24,6 +24,7 @@
"@types/react": "18.2.18",
"@types/react-dom": "18.2.7",
"@types/webpack-env": "^1.18.1",
"altcha": "2.2.3",
"autoprefixer": "^10.4.12",
"cheerio": "^1.0.0-rc.12",
"clsx": "^1.2.1",

View File

@@ -72,11 +72,11 @@ export default function Club() {
</thead>
<tbody className="divide-y divide-gray-200 ">
<tr>
<TableLeftHeading>Lisa Pedersen</TableLeftHeading>
<TableLeftHeading>Leslie Brown</TableLeftHeading>
<TableCell>President</TableCell>
</tr>
<tr>
<TableLeftHeading>Betsy Wareham</TableLeftHeading>
<TableLeftHeading>Lisa Pedersen</TableLeftHeading>
<TableCell>Vice President</TableCell>
</tr>
<tr>
@@ -84,15 +84,11 @@ export default function Club() {
<TableCell>Secretary</TableCell>
</tr>
<tr>
<TableLeftHeading>Tony Grosinger</TableLeftHeading>
<TableLeftHeading>David Clough</TableLeftHeading>
<TableCell>Treasurer</TableCell>
</tr>
<tr>
<TableLeftHeading>Leslie Brown</TableLeftHeading>
<TableCell>Director</TableCell>
</tr>
<tr>
<TableLeftHeading>Linn Hulley</TableLeftHeading>
<TableLeftHeading>Betsy Wareham</TableLeftHeading>
<TableCell>Director</TableCell>
</tr>
</tbody>

View File

@@ -1,5 +1,7 @@
"use client"
import "altcha";
export default function MailingListSignupForm(): React.JSX.Element {
return (<form method="post" action="https://lists.orcas.community/subscription/form" className="listmonk-form">
<div className="flex flex-col gap-y-2">
@@ -11,7 +13,7 @@ export default function MailingListSignupForm(): React.JSX.Element {
type="email"
name="email"
id="email"
className="block w-full rounded-md border-0 py-1.5 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-indigo-600 sm:text-sm sm:leading-6"
className="block w-full rounded-md border-0 pl-4 py-1.5 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-indigo-600 sm:text-sm sm:leading-6"
placeholder="you@example.com" />
</div>
<div>
@@ -20,12 +22,14 @@ export default function MailingListSignupForm(): React.JSX.Element {
type="text"
name="name"
id="name"
className="block w-full rounded-md border-0 py-1.5 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-indigo-600 sm:text-sm sm:leading-6"
className="block w-full rounded-md border-0 pl-4 py-1.5 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-indigo-600 sm:text-sm sm:leading-6"
placeholder="Jane Doe" />
</div>
<input className="hidden" type="checkbox" name="l" checked value="ea5f1e67-2ff0-4762-8893-0645e93a8306" />
<div className="h-captcha flex justify-center" data-sitekey="77aeddb4-cfda-4a3e-b262-0288a4e4664a"></div>
<script src="https://js.hcaptcha.com/1/api.js" async defer></script>
<div className="flex justify-center">
<altcha-widget challengeurl="https://lists.orcas.community/api/public/captcha/altcha"></altcha-widget>
</div>
<input
className="w-full rounded-md flex justify-center border border-transparent bg-indigo-600 px-4 py-2 text-sm font-medium text-white shadow-sm hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2"
id="submit"
@@ -34,4 +38,4 @@ export default function MailingListSignupForm(): React.JSX.Element {
/>
</div>
</form>);
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

View File

@@ -0,0 +1,52 @@
import { ArticleLayout } from '@/components/ArticleLayout'
import {MdxImage as Image } from '@/components/MdxImage'
import endurance from './endurance.png'
export const article = {
author: 'Leslie Brown',
date: '2026-04-02',
title: 'Orcas Island ENDURANCE Screening',
description: "Join us for a screening of the National Geographic documentary ENDURANCE at The Seaview Theatre, hosted by producer Ruth Johnston. All proceeds benefit the West Sound Community Club.",
}
export const metadata = {
title: article.title,
description: article.description,
}
export default (props) => <ArticleLayout article={article} {...props} />
Excitement is in the air! Get ready to be part of something extraordinary supporting
The West Sound Community Club. It's an event like no other, and we want you to be there!
<Image src={endurance} />
Orcas Island's own Ruth Johnston, Producer on the documentary ENDURANCE will host a
screening of the film at The Seaview Theatre: In a legendary feat of leadership an
perseverance, polar explorer Sir Ernest Shackleton kept his crew of 27 men alive for
over a year despite the loss of their ship in frigid pack ice. Over a century later,
a team of modern-day explorers sets out to find the sunken ship. From National
Geographic Documentary Films and directed by Chai Vasarhelyi, Jimmy Chin and Natalie
Hewit, ENDURANCE tells the inspiring stories of these two landmark expeditions,
bound by their shared grit and determination.
Join Ruth and others before the film for a drink and after the film for a Q&A and
more. Doors will open at 1:15. All proceeds from the evening are being generously
donated to the West Sound Community Club. The event is free, so please donate as
generously as you are able (Minimum suggested donation $25 pp) to help out this
beloved community club and hall.
Following the screening, the after party will commence at the Lower Tavern (21+ only)
with Sea Shanties and Endurance-themed food and drink. The Lower is generously donating
a portion of beverage sales to the Community Club.
The event is kindly sponsored by The Orcas Island Film Festival, The Explorers Club
(PNW chapter), The Lower Tavern and Consequential. Every donation from this event
will bring us closer to achieving our goal to continue to be a vital part of the
Orcas community. Thank you for supporting our mission, your support is invaluable.
Please consider a company match for your donation.
West Sound Community Club operates as a 501c 3 non profit corporation tax
ID number 91-1283768.

View File

@@ -40,6 +40,9 @@ export function Footer() {
<p className="text-sm text-zinc-400">
WSCC is a 501c3 nonprofit organization - 91-1283768
</p>
<p className="text-sm text-zinc-400">
PO Box 1414, Eastsound, WA 98245
</p>
</div>
</div>
</ContainerInner>

View File

@@ -1,11 +1,11 @@
import typographyPlugin from '@tailwindcss/typography'
import formsPlugin from '@tailwindcss/forms';
import { type Config } from 'tailwindcss'
const typographyPlugin = require('@tailwindcss/typography')
const formsPlugin = require('@tailwindcss/forms')
import typographyStyles from './typography'
const typographyStyles = require('./typography')
export default {
content: ['./src/**/*.{js,jsx,ts,tsx}'],
/** @type {import('tailwindcss').Config} */
module.exports = {
content: ['./src/**/*.{js,jsx,mdx,ts,tsx}'],
darkMode: 'class',
plugins: [
typographyPlugin,
@@ -29,4 +29,4 @@ export default {
},
typography: typographyStyles,
},
} satisfies Config
}

View File

@@ -1,6 +1,4 @@
import { type PluginUtils } from 'tailwindcss/types/config'
export default function typographyStyles({ theme }: PluginUtils) {
module.exports = function typographyStyles({ theme }) {
return {
invert: {
css: {