- Astro 51.3%
- TypeScript 29.2%
- CSS 18.3%
- JavaScript 1.2%
| .forgejo/workflows | ||
| .vscode | ||
| celilo-module | ||
| public | ||
| src | ||
| .gitignore | ||
| AGENTS.md | ||
| astro.config.mjs | ||
| CLAUDE.md | ||
| mise.toml | ||
| package-lock.json | ||
| package.json | ||
| README.md | ||
| tsconfig.json | ||
tango-nexus
Astro site for NEXUS — Portland's All Alternative Tango Weekend (Sept 11–13).
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@latestis now 7.x, whichastro checkcan't use (it needs a programmatic API that TS 7's native compiler doesn't ship yet). lasertag depends on an exacttypescript@7.0.2; npm nests that copy, so both tools work. Don't "upgrade" TypeScript here without re-runningastro check. - lasertag pins
enginesto node 26.5.0 / pnpm 11.13.0 exactly. It installs and runs fine on node 24 under npm, with anEBADENGINEwarning.
TODO
- The signup form has no endpoint — the submit button is disabled on
purpose, so a signup can't be silently dropped. Wire
ENDPOINTinSignupForm.astrowhen there's somewhere to post. - The "Volunteer for the event?" option text was truncated in the source screenshot; verify the real wording.