diff --git a/apps/site/package.json b/apps/site/package.json index 8d6b14ee..4e7d00f1 100644 --- a/apps/site/package.json +++ b/apps/site/package.json @@ -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", @@ -59,6 +59,7 @@ "astro-icon": "catalog:", "fast-xml-parser": "catalog:", "ical.js": "catalog:", + "sharp": "catalog:", "sitemap": "catalog:", "tailwindcss": "catalog:", "zod": "catalog:" @@ -79,6 +80,7 @@ "alex": "catalog:", "astro": "catalog:", "cspell": "catalog:", + "esbuild": "catalog:", "eslint": "catalog:", "html-validate": "catalog:", "pagefind": "catalog:", diff --git a/apps/site/playwright.config.ts b/apps/site/playwright.config.ts index 85494732..3098394a 100644 --- a/apps/site/playwright.config.ts +++ b/apps/site/playwright.config.ts @@ -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 @@ -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'] }, }, { diff --git a/apps/site/scripts/minify-public-scripts.ts b/apps/site/scripts/minify-public-scripts.ts new file mode 100644 index 00000000..5fde32d3 --- /dev/null +++ b/apps/site/scripts/minify-public-scripts.ts @@ -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`); diff --git a/apps/site/src/assets/home/arts-district-meeting-september-2026.jpg b/apps/site/src/assets/home/arts-district-meeting-september-2026.jpg new file mode 100644 index 00000000..da7cecf5 Binary files /dev/null and b/apps/site/src/assets/home/arts-district-meeting-september-2026.jpg differ diff --git a/apps/site/src/assets/home/first-friday-september-2026.jpg b/apps/site/src/assets/home/first-friday-september-2026.jpg new file mode 100644 index 00000000..4ac6bba2 Binary files /dev/null and b/apps/site/src/assets/home/first-friday-september-2026.jpg differ diff --git a/apps/site/src/assets/home/sources.json b/apps/site/src/assets/home/sources.json new file mode 100644 index 00000000..a5c86a66 --- /dev/null +++ b/apps/site/src/assets/home/sources.json @@ -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 + } +] diff --git a/apps/site/src/assets/transit/downtown-loop-september-2026.jpg b/apps/site/src/assets/transit/downtown-loop-september-2026.jpg new file mode 100644 index 00000000..8efc81f5 Binary files /dev/null and b/apps/site/src/assets/transit/downtown-loop-september-2026.jpg differ diff --git a/apps/site/src/assets/transit/route-109-riders-july-2026.jpg b/apps/site/src/assets/transit/route-109-riders-july-2026.jpg new file mode 100644 index 00000000..b5111eb8 Binary files /dev/null and b/apps/site/src/assets/transit/route-109-riders-july-2026.jpg differ diff --git a/apps/site/src/assets/transit/sources.json b/apps/site/src/assets/transit/sources.json new file mode 100644 index 00000000..74c1e2d7 --- /dev/null +++ b/apps/site/src/assets/transit/sources.json @@ -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" + } + ] +} diff --git a/apps/site/src/components/app/PrototypeLayout.astro b/apps/site/src/components/app/PrototypeLayout.astro index ea2fe4ac..86acaeaf 100644 --- a/apps/site/src/components/app/PrototypeLayout.astro +++ b/apps/site/src/components/app/PrototypeLayout.astro @@ -12,7 +12,7 @@ const { title } = Astro.props; --- -

+

{PROTOTYPE_BANNER}

diff --git a/apps/site/src/components/app/styles.ts b/apps/site/src/components/app/styles.ts index e731de79..52ee9be3 100644 --- a/apps/site/src/components/app/styles.ts +++ b/apps/site/src/components/app/styles.ts @@ -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'; diff --git a/apps/site/src/components/site/Footer.astro b/apps/site/src/components/site/Footer.astro index 481caa1c..3e2e5d2b 100644 --- a/apps/site/src/components/site/Footer.astro +++ b/apps/site/src/components/site/Footer.astro @@ -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. @@ -170,23 +170,31 @@ const printLinkSheetSections: Array<{ links: PrintLinkSheetLink[] }> = [