Astro site for NEXUS — Portland's All Alternative Tango Weekend. Hero wordmark via @celilo/visualizer; ships a celilo module (celilo-module/) that deploys it via Caddy. https://nexus.lunacycle.net
  • Astro 50.6%
  • CSS 24.8%
  • TypeScript 23.5%
  • JavaScript 1.1%
Find a file
Peter Banka b87c6b4e81
All checks were successful
release / version (push) Successful in 1s
release / publish (push) Successful in 27s
Merge pull request 'chore: version tango-nexus' (#35) from changeset-release/main into main
Reviewed-on: #35
2026-09-26 20:23:47 +00:00
.forgejo/workflows Give CI bun — @celilo/cli refuses to run under node 2026-08-03 17:06:48 -07:00
.vscode Initial commit: NEXUS tango-weekend Astro site + celilo module 2026-07-18 13:02:23 -07:00
celilo-module chore: version tango-nexus 2026-09-26 20:13:00 +00:00
public Make calendar dates jump, and give each session its own .ics 2026-08-04 18:55:11 -07:00
src Merge pull request 'Add NEXUS lede, email sign-up, quotes, and thank-yous' (#30) from nexus-2027-lede into main 2026-09-26 19:41:41 +00:00
.gitignore Draw bold quote marks instead of the thin font glyphs 2026-09-26 12:03:49 -07:00
AGENTS.md Initial commit: NEXUS tango-weekend Astro site + celilo module 2026-07-18 13:02:23 -07:00
astro.config.mjs Turn the homepage into the October 2027 teaser 2026-09-22 22:46:30 -07:00
CLAUDE.md Initial commit: NEXUS tango-weekend Astro site + celilo module 2026-07-18 13:02:23 -07:00
mise.toml Give CI bun — @celilo/cli refuses to run under node 2026-08-03 17:06:48 -07:00
package-lock.json chore: bump celilo libraries to latest 2026-09-26 12:57:27 -07:00
package.json chore: bump celilo libraries to latest 2026-09-26 12:57:27 -07:00
README.md Turn the homepage into the October 2027 teaser 2026-09-22 22:46:30 -07:00
tsconfig.json Publish the module from CI on merge to main 2026-08-03 16:09:31 -07:00

tango-nexus

Astro site for NEXUS — Portland's All Alternative Tango Weekend. The homepage is the October 2027 teaser (a photo wall, src/components/Montage.astro; drop photos into src/assets/montage/); the 2026 weekend lives on at /2026.

npm install
npm run dev        # localhost:4321
npm run build
npm run lint:css   # lasertag — find dead CSS
npx astro check    # types

The hero mark

NEXUS is generated by @celilo/visualizer: a word rendered as the negative space in smooth flowing water.

The whole look lives in src/nexus-mark.json — nothing else needs editing. Tune it in the visualizer's /flow route (cd ../celilo/packages/visualizer && bun run dev, then http://localhost:3000/flow), hit EXPORT JSON, and paste the result over that file. It's a CeliloMarkOptions, which is exactly what renderCeliloMark() takes — no conversion step.

The canvas is decoration: the accessible name is a visually-hidden <span> in the <h1>, and a render failure is caught so the heading still reads.

Fonts are copied into public/fonts/ and declared in BaseLayout.astro. A font name alone is not enough — an undeclared family silently falls back to sans-serif and the mask comes out the wrong shape.

Conventions

@celilo/visualizer is linked by relative path (file:../celilo/packages/…), so this repo expects celilo checked out as a sibling. It ships TypeScript source, which Vite compiles — no build step or config needed.

CSS follows lasertag: each component has a same-stem .module.css, and its root is its own kebab-case custom element carrying class={css.class}. A module exposes only class — one per component. Style everything inside with nested element / custom-element selectors, not extra local classes. *Layout components are exempt (lasertag treats them as transparent slot wrappers).

Gotchas

  • TypeScript is pinned to ^6. typescript@latest is now 7.x, which astro check can't use (it needs a programmatic API that TS 7's native compiler doesn't ship yet). lasertag depends on an exact typescript@7.0.2; npm nests that copy, so both tools work. Don't "upgrade" TypeScript here without re-running astro check.
  • lasertag pins engines to node 26.5.0 / pnpm 11.13.0 exactly. It installs and runs fine on node 24 under npm, with an EBADENGINE warning.

TODO

  • The signup form has no endpoint — the submit button is disabled on purpose, so a signup can't be silently dropped. Wire ENDPOINT in SignupForm.astro when there's somewhere to post.
  • The "Volunteer for the event?" option text was truncated in the source screenshot; verify the real wording.