Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion apps/site/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
"dev": "portless",
"dev:app": "sh -lc 'trap \"kill 0\" INT TERM EXIT; astro dev --host 127.0.0.1 --port ${PORT:-4320} & wrangler pages dev .wrangler/dev-static --ip 127.0.0.1 --port 4321 & wait'",
"build": "pnpm build:site && pnpm build:functions",
"build:site": "astro build && pagefind --site dist --output-subdir pagefind",
"build:site": "astro build && tsx scripts/minify-public-scripts.ts && pagefind --site dist --output-subdir pagefind",
"build:functions": "wrangler pages functions build functions --outdir .wrangler/worker",
"preview": "wrangler dev --local",
"sync": "astro sync",
Expand Down Expand Up @@ -59,6 +59,7 @@
"astro-icon": "catalog:",
"fast-xml-parser": "catalog:",
"ical.js": "catalog:",
"sharp": "catalog:",
"sitemap": "catalog:",
"tailwindcss": "catalog:",
"zod": "catalog:"
Expand All @@ -79,6 +80,7 @@
"alex": "catalog:",
"astro": "catalog:",
"cspell": "catalog:",
"esbuild": "catalog:",
"eslint": "catalog:",
"html-validate": "catalog:",
"pagefind": "catalog:",
Expand Down
5 changes: 2 additions & 3 deletions apps/site/playwright.config.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
// Visual-regression screenshot harness. See tests/README.md for usage,
// baseline policy, and the cross-platform pixel-hinting caveat.
// Screenshot and behavior harness; baseline policy: tests/README.md.
import { defineConfig, devices } from '@playwright/test';

// AUDIT_PORT lets the baseline orchestrator pick a non-default port so it
Expand Down Expand Up @@ -38,7 +37,7 @@ export default defineConfig({
{
name: 'ui-contracts',
testMatch:
/(body-links|color-contracts|event-metadata|footer-colophon|header-current|not-found-search|print-layout|typography-contracts)\.spec\.ts$/,
/(campaign-events|body-links|color-contracts|event-metadata|footer-colophon|header-current|not-found-search|print-layout|typography-contracts)\.spec\.ts$/,
use: { ...devices['Desktop Chrome'] },
},
{
Expand Down
19 changes: 19 additions & 0 deletions apps/site/scripts/minify-public-scripts.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { readdir, readFile, writeFile } from 'node:fs/promises';
import { resolve } from 'node:path';
import { transform } from 'esbuild';

const directory = resolve('dist/scripts');
const files = (await readdir(directory)).filter((file) => file.endsWith('.js'));

for (const file of files) {
const path = resolve(directory, file);
const { code } = await transform(await readFile(path, 'utf8'), {
loader: 'js',
minify: true,
target: 'es2022',
sourcefile: file,
});
await writeFile(path, code);
}

process.stdout.write(`Minified ${files.length} public interaction scripts.\n`);
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
18 changes: 18 additions & 0 deletions apps/site/src/assets/home/sources.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
[
{
"file": "first-friday-september-2026.jpg",
"source": "https://drive.google.com/file/d/1ohmz0cdyHBrVEBLQMi2MdqPdOESwFtTD/view",
"archiveFolder": "First Friday Stuffs",
"capturedAt": "2026-09-05T01:57:44Z",
"captionLocation": "First Friday, Arts District",
"photographer": null
},
{
"file": "arts-district-meeting-september-2026.jpg",
"source": "https://drive.google.com/file/d/1FaL6YLgUm48M_dcHpPiEfRV57hklZDTg/view",
"archiveFolder": "Arts District Tony Meeting",
"capturedAt": "2026-09-11T21:25:37Z",
"captionLocation": "Arts District",
"photographer": null
}
]
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
19 changes: 19 additions & 0 deletions apps/site/src/assets/transit/sources.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{
"status": "User-selected photos for the LVBT website preview",
"photos": [
{
"file": "route-109-riders-july-2026.jpg",
"originalFilename": "PXL_20260729_235107466.jpg",
"taken": "2026-07-29T16:51:07-07:00",
"description": "People waiting by RTC Route 109 North at Harry Reid International Airport",
"source": "https://photos.google.com/search/Cg1MYXMgVmVnYXMgYnVzIg8KDUxhcyBWZWdhcyBidXMoxuiOzpA0OAM%3D/relevance/photo/AF1QipPuz2Ep1pQY-gHqAyzMkMNGxhkvXeRhDeDBDITz"
},
{
"file": "downtown-loop-september-2026.jpg",
"originalFilename": "PXL_20260921_231506311.MP.jpg",
"taken": "2026-09-21T16:15:06-07:00",
"description": "Downtown Loop shuttle framed by a street tree in Las Vegas",
"source": "https://photos.google.com/search/Cg1MYXMgVmVnYXMgYnVzIg8KDUxhcyBWZWdhcyBidXMoxuiOzpA0OAM%3D/relevance/photo/AF1QipNB8QnWedtf3KBa2xCD44bIcxGgUS1EF1nGp5nX"
}
]
}
2 changes: 1 addition & 1 deletion apps/site/src/components/app/PrototypeLayout.astro
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ const { title } = Astro.props;
---

<BaseLayout title={`${title} · Prototype`} noindex>
<p class="bg-primary-ink text-on-primary px-4 py-3 text-center font-bold" data-prototype-banner>
<p class="bg-primary-ink text-surface px-4 py-3 text-center font-bold" data-prototype-banner>
{PROTOTYPE_BANNER}
</p>
<slot />
Expand Down
2 changes: 1 addition & 1 deletion apps/site/src/components/app/styles.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ const buttonBase =
export const buttonClass = {
primary: `${buttonBase} bg-on-surface text-surface border-on-surface hover:bg-primary hover:border-primary hover:text-on-primary focus-visible:bg-primary focus-visible:text-on-primary`,
secondary: `${buttonBase} bg-transparent text-on-surface border-on-surface hover:bg-surface-container`,
destructive: `${buttonBase} bg-primary-ink text-on-primary border-primary-ink hover:bg-on-surface hover:border-on-surface`,
destructive: `${buttonBase} bg-primary-ink text-surface border-primary-ink hover:bg-on-surface hover:border-on-surface`,
} as const;

export const linkClass = 'font-bold underline underline-offset-4 decoration-2 decoration-primary';
50 changes: 30 additions & 20 deletions apps/site/src/components/site/Footer.astro
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ const printLinkSheetSections: Array<{ links: PrintLinkSheetLink[] }> = [
it should read as a utility strip, not another content band.

LINK STYLING
One style everywhere: `nav-link no-underline hover:text-primary`.
One style everywhere: `nav-link no-underline hover:text-primary-soft`.
`.nav-link` provides the scaleX underline reveal. Do not
introduce a second link style; the consistency is the point.

Expand Down Expand Up @@ -170,41 +170,51 @@ const printLinkSheetSections: Array<{ links: PrintLinkSheetLink[] }> = [
<div class="footer-nav reveal" data-footer-nav="organization">
<p class="text-title-md font-bold text-primary-soft">Organization</p>
<ul class="footer-nav-list text-base font-semibold">
<li><a href="/about" class="nav-link no-underline hover:text-primary">About</a></li>
<li><a href="/programs" class="nav-link no-underline hover:text-primary">Programs</a></li>
<li><a href="/projects" class="nav-link no-underline hover:text-primary">Projects</a></li>
<li><a href="/about" class="nav-link no-underline hover:text-primary-soft">About</a></li>
<li>
<a href="/programs" class="nav-link no-underline hover:text-primary-soft">Programs</a>
</li>
<li>
<a href="/projects" class="nav-link no-underline hover:text-primary-soft">Projects</a>
</li>
<li>
<a
href="https://labs.lasvegasfortransit.org/"
rel="noopener"
class="nav-link no-underline hover:text-primary">Labs</a
class="nav-link no-underline hover:text-primary-soft">Labs</a
>
</li>
<li><a href="/events" class="nav-link no-underline hover:text-primary">Events</a></li>
<li><a href="/contact" class="nav-link no-underline hover:text-primary">Contact</a></li>
<li>
<a href="/events" class="nav-link no-underline hover:text-primary-soft">Events</a>
</li>
<li>
<a href="/contact" class="nav-link no-underline hover:text-primary-soft">Contact</a>
</li>
<li>
<a
href={site.transparency.candidUrl}
rel="noopener"
class="nav-link no-underline hover:text-primary">Candid</a
class="nav-link no-underline hover:text-primary-soft">Candid</a
>
</li>
</ul>
</div>
<div class="footer-nav reveal" data-footer-nav="get-involved">
<p class="text-title-md font-bold text-primary-soft">Get involved</p>
<ul class="footer-nav-list text-base font-semibold">
<li><a href="/join" class="nav-link no-underline hover:text-primary">Join us</a></li>
<li><a href="/join" class="nav-link no-underline hover:text-primary-soft">Join us</a></li>
<li>
<a href="/newsletter" class="nav-link no-underline hover:text-primary">Newsletter</a>
<a href="/newsletter" class="nav-link no-underline hover:text-primary-soft"
>Newsletter</a
>
</li>
{
site.donate.url && (
<li>
<a
href={site.donate.url}
rel="noopener"
class="nav-link no-underline hover:text-primary"
class="nav-link no-underline hover:text-primary-soft"
>
Donate
</a>
Expand All @@ -217,7 +227,7 @@ const printLinkSheetSections: Array<{ links: PrintLinkSheetLink[] }> = [
<a
href={site.social.discord}
rel="noopener"
class="nav-link no-underline hover:text-primary"
class="nav-link no-underline hover:text-primary-soft"
>
Discord
</a>
Expand All @@ -230,7 +240,7 @@ const printLinkSheetSections: Array<{ links: PrintLinkSheetLink[] }> = [
<a
href={site.social.instagram}
rel="noopener"
class="nav-link no-underline hover:text-primary"
class="nav-link no-underline hover:text-primary-soft"
>
Instagram
</a>
Expand All @@ -243,7 +253,7 @@ const printLinkSheetSections: Array<{ links: PrintLinkSheetLink[] }> = [
<a
href={site.social.linkedin}
rel="noopener"
class="nav-link no-underline hover:text-primary"
class="nav-link no-underline hover:text-primary-soft"
>
LinkedIn
</a>
Expand All @@ -253,7 +263,7 @@ const printLinkSheetSections: Array<{ links: PrintLinkSheetLink[] }> = [
<li>
<a
href={`mailto:${site.email.general}`}
class="nav-link no-underline hover:text-primary">Email</a
class="nav-link no-underline hover:text-primary-soft">Email</a
>
</li>
</ul>
Expand Down Expand Up @@ -359,15 +369,15 @@ const printLinkSheetSections: Array<{ links: PrintLinkSheetLink[] }> = [
aria-label="Site utilities"
>
<span class="footer-utility-group">
<a href="/colophon" class="nav-link no-underline hover:text-primary">Colophon</a>
<a href="/brand" class="nav-link no-underline hover:text-primary">Brand</a>
<a href="/colophon" class="nav-link no-underline hover:text-primary-soft">Colophon</a>
<a href="/brand" class="nav-link no-underline hover:text-primary-soft">Brand</a>
</span>
<span class="footer-utility-group">
<a href="/sitemap" class="nav-link no-underline hover:text-primary">Sitemap</a>
<a href="/sitemap" class="nav-link no-underline hover:text-primary-soft">Sitemap</a>
<a
href="https://github.com/LasVegasForTransit/website"
rel="noopener"
class="nav-link no-underline hover:text-primary">Source</a
class="nav-link no-underline hover:text-primary-soft">Source</a
>
{
/* Opens the QR presenter (/qr) — a chromeless deck of scan cards for
Expand All @@ -378,7 +388,7 @@ const printLinkSheetSections: Array<{ links: PrintLinkSheetLink[] }> = [
}
<a
href="/qr"
class="qr-portal inline-flex items-center hover:text-primary"
class="qr-portal inline-flex items-center hover:text-primary-soft"
aria-label="Scan cards"
title="Scan cards"
>
Expand Down
30 changes: 19 additions & 11 deletions apps/site/src/components/site/Header.astro
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ const path = normalizePath(Astro.url.pathname);
href="/join"
data-auth="signed-out"
aria-current={active ? 'page' : undefined}
class="nav-link no-underline hover:text-primary"
class="nav-link no-underline hover:text-primary-ink"
>
Join
</a>
Expand All @@ -56,7 +56,7 @@ const path = normalizePath(Astro.url.pathname);
data-auth="signed-in"
hidden
aria-current={path === '/go' ? 'page' : undefined}
class="nav-link no-underline hover:text-primary"
class="nav-link no-underline hover:text-primary-ink"
>
Get involved
</a>
Expand All @@ -65,7 +65,7 @@ const path = normalizePath(Astro.url.pathname);
<a
href={item.href}
aria-current={active ? 'page' : undefined}
class="nav-link no-underline hover:text-primary"
class="nav-link no-underline hover:text-primary-ink"
>
{item.label}
</a>
Expand All @@ -85,12 +85,16 @@ const path = normalizePath(Astro.url.pathname);
}
<div class="hidden md:flex items-center gap-6">
<div class="flex items-center gap-5 text-sm font-semibold">
<a href="/sign-in/" data-auth="signed-out" class="nav-link no-underline hover:text-primary">
<a
href="/sign-in/"
data-auth="signed-out"
class="nav-link no-underline hover:text-primary-ink"
>
{t('header.signIn')}
</a>
<details data-auth="signed-in" hidden class="relative group">
<summary
class="flex cursor-pointer list-none items-center gap-2 font-semibold hover:text-primary"
class="flex cursor-pointer list-none items-center gap-2 font-semibold hover:text-primary-ink"
>
<span
class="flex size-9 items-center justify-center rounded-full bg-primary-container text-primary-ink"
Expand All @@ -101,13 +105,13 @@ const path = normalizePath(Astro.url.pathname);
<div class="absolute right-0 top-full z-50 mt-3 w-48 bg-surface-container p-3 shadow-lg">
<a
href="/account/"
class="block px-3 py-2 no-underline font-semibold hover:bg-surface hover:text-primary"
class="block px-3 py-2 no-underline font-semibold hover:bg-surface hover:text-primary-ink"
>{t('header.account')}</a
>
<form method="post" action="/sign-out/">
<button
type="submit"
class="block w-full px-3 py-2 text-left font-semibold hover:bg-surface hover:text-primary"
class="block w-full px-3 py-2 text-left font-semibold hover:bg-surface hover:text-primary-ink"
>{t('header.signOut')}</button
>
</form>
Expand Down Expand Up @@ -179,7 +183,7 @@ const path = normalizePath(Astro.url.pathname);
<a
href={item.href}
aria-current={active ? 'page' : undefined}
class="flex items-center py-5 text-2xl font-extrabold tracking-tight no-underline hover:text-primary aria-[current=page]:text-primary"
class="flex items-center py-5 text-2xl font-extrabold tracking-tight no-underline hover:text-primary-ink aria-[current=page]:text-primary-ink"
>
{item.label}
</a>
Expand All @@ -189,7 +193,7 @@ const path = normalizePath(Astro.url.pathname);
}
</ul>
<div class="px-6 pt-4 flex flex-wrap items-center gap-6 text-lg font-bold">
<a href="/sign-in/" data-auth="signed-out" class="no-underline hover:text-primary">
<a href="/sign-in/" data-auth="signed-out" class="no-underline hover:text-primary-ink">
{t('header.signIn')}
</a>
<details data-auth="signed-in" hidden class="w-full bg-surface-container p-4">
Expand All @@ -200,9 +204,13 @@ const path = normalizePath(Astro.url.pathname);
><span>Profile</span></summary
>
<div class="mt-4 space-y-3 pl-13 text-base">
<a href="/account/" class="block no-underline hover:text-primary">{t('header.account')}</a>
<a href="/account/" class="block no-underline hover:text-primary-ink"
>{t('header.account')}</a
>
<form method="post" action="/sign-out/">
<button type="submit" class="font-bold hover:text-primary">{t('header.signOut')}</button>
<button type="submit" class="font-bold hover:text-primary-ink"
>{t('header.signOut')}</button
>
</form>
</div>
</details>
Expand Down
1 change: 1 addition & 0 deletions apps/site/src/layouts/BaseLayout.astro
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,7 @@ const canonical = canonicalUrl(Astro.url.pathname);
}
<main
id="main"
tabindex="-1"
class:list={['flex-1', mainClass]}
data-pagefind-body={searchIndex ? '' : undefined}
>
Expand Down
1 change: 1 addition & 0 deletions apps/site/src/lib/campaigns/arts-district.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ export interface ArtsDistrictEvent {
details: string[];
proposed?: boolean;
start?: string;
end?: string;
dateLabel?: string;
venue?: string;
venueUrl?: string;
Expand Down
Loading
Loading