D. Rimron-Soutter 240936a850 Standardize ZXDB UI; add SSR search/tables
Unify the look and feel of all /zxdb pages and minimize client pop-in.

- Make all /zxdb pages full-width to match /explorer
- Convert Languages, Genres, Machine Types, and Labels lists to
  Bootstrap tables with table-striped and table-hover inside
  table-responsive wrappers
- Replace raw FK IDs with linked names via SSR repository joins
- Add scoped search boxes on detail pages (labels, genres, languages,
  machine types) with SSR filtering and pagination that preserves q/tab
- Keep explorer results consistent: show Machine/Language names with
  links, no client lookups required

This improves consistency, readability, and first paint stability across
the ZXDB section while keeping navigation fast and discoverable.

Signed-off-by: Junie@lucy.xalior.com
2025-12-12 16:58:50 +00:00
2025-12-12 13:43:30 +00:00
2025-11-13 15:21:30 +00:00
2025-12-12 13:43:30 +00:00
2025-12-12 13:43:30 +00:00
2025-10-07 22:04:14 +01:00
2025-10-07 22:04:14 +01:00
2025-10-07 22:01:08 +01:00
2025-10-15 23:04:08 +01:00

Spectrum Next Explorer

A Next.js application for exploring the Spectrum Next ecosystem. It ships with:

  • Register Explorer: parsed from data/nextreg.txt, with realtime search and deep links
  • ZXDB Explorer: a deep, crosslinked browser for entries, labels, genres, languages, and machine types backed by a MySQL ZXDB instance
  • Bootstrap 5 theme with light/dark support

Quick start

  • Prerequisites: Node.js 20+, pnpm (recommended), access to a MySQL server for ZXDB (optional for Registers)
  • Install dependencies:
    • pnpm install
  • Run in development (Turbopack, port 4000):
  • Build and start (production):
  • Lint:
    • pnpm lint

Project scripts (package.json)

  • dev: PORT=4000 next dev --turbopack
  • build: next build --turbopack
  • start: next start
  • deploy-test: push to test.explorer.specnext.dev
  • deploy-prod: push to explorer.specnext.dev

Routes

  • / — Home
  • /registers — Register Explorer
  • /zxdb — ZXDB Explorer (search + filters)
  • /zxdb/entries/[id] — Entry detail
  • /zxdb/labels and /zxdb/labels/[id] — Labels search and detail
  • /zxdb/genres and /zxdb/genres/[id] — Genres list and entries
  • /zxdb/languages and /zxdb/languages/[id] — Languages list and entries
  • /zxdb/machinetypes and /zxdb/machinetypes/[id] — Machine types list and entries

ZXDB setup (database, env, and helper tables) The Registers section works without any database. The ZXDB Explorer requires a MySQL ZXDB database and one environment variable.

  1. Prepare the database (outside this app)
  • Import ZXDB data into MySQL. If you want only structure, use ZXDB/ZXDB_mysql_STRUCTURE_ONLY.sql in this repo. For data, import ZXDB via your normal process.
  • Create the helper search tables (required for fast search):
    • Run ZXDB/scripts/ZXDB_help_search.sql against your ZXDB database.
  • Create a readonly role/user (recommended):
    • Example (see bin/import_mysql.sh):
      • Create role zxdb_readonly
      • Grant SELECT, SHOW VIEW on database zxdb
  1. Configure environment
  • Copy .env from example.env.
  • Set ZXDB_URL to a MySQL URL, e.g. mysql://zxdb_readonly:password@hostname:3306/zxdb.
  • On startup, src/env.ts validates env vars (t3.gg pattern with Zod) and will fail fast if invalid.
  1. Run the app

API (selected endpoints)

  • GET /api/zxdb/search?q=...&page=1&pageSize=20&genreId=...&languageId=...&machinetypeId=...&sort=title&facets=1
  • GET /api/zxdb/entries/[id]
  • GET /api/zxdb/labels/search?q=...
  • GET /api/zxdb/labels/[id]?page=1&pageSize=20
  • GET /api/zxdb/genres and /api/zxdb/genres/[id]?page=1
  • GET /api/zxdb/languages and /api/zxdb/languages/[id]?page=1
  • GET /api/zxdb/machinetypes and /api/zxdb/machinetypes/[id]?page=1

Implementation notes

  • Next.js 15 dynamic params: pages and API routes that consume params must await it, e.g. export default async function Page({ params }: { params: Promise<{ id: string }> }) { const { id } = await params; }
  • ZXDB integration uses Drizzle ORM over mysql2 with a singleton pool at src/server/db.ts; API routes declare export const runtime = "nodejs".
  • Entry and detail pages serverrender initial content and use ISR (revalidate = 3600) for fast timetocontent; index pages avoid a blocking first client fetch.

Further reading

  • ZXDB details and API usage: docs/ZXDB.md
  • Agent/developer workflow and commit guidelines: AGENTS.md

License

  • See LICENSE.txt for details.
Description
Languages
TypeScript 77.3%
SCSS 11.6%
CSS 7.5%
JavaScript 2%
Dockerfile 1.4%
Other 0.2%