mcpField
R
react-ui

react-ui

github.com/val-townDevelopment1042 installsUpdated 5w ago
Repository

About react-ui

A Val Town skill guide for building user interfaces with React. It covers file conventions, styling, asset serving, source links, and verification practices for UI vals.

Key features

  1. 01React UI component conventions
  2. 02Twind and Tailwind styling
  3. 03Immutable asset serving
  4. 04Source links for UI vals
  5. 05UI verification steps

Use cases

  1. 01Building an interactive val interface
  2. 02Structuring UI across TSX files
  3. 03Checking rendered pages and browser errors

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/val-town/plugins --skill react-ui

After installing, type/react-uiin Claude Code to confirm it loaded.

Details

From the project README

React UI

For any val that renders a UI, prefer to build it with React components in .tsx files, unless the user states otherwise. The templates/react-hono-starter template is set up for this — start there with remix_val instead of building from scratch.

File conventions

Put markup, styles, and scripts in real files — avoid template literal strings (e.g. new Response(\...`)`). Code in template strings has no syntax highlighting, no linting, no type checking, and is unreviewable.

  • .tsx — React/JSX components, any UI with logic or interactivity
  • .html — purely static markup
  • .ts — server code and scripts

Build UI component by component in .tsx files. Compose small components rather than rendering one giant page.

Styling: Twind + Tailwind

Prefer Twind to apply Tailwind utility classes at runtime — no build step required. Add the script to your HTML shell:

<script src="https://cdn.twind.style" crossorigin></script>

Then use Tailwind classes directly in JSX:

<div className="flex items-center gap-4 p-6 rounded-lg bg-white shadow">
  <h1 className="text-2xl font-bold">Hello</h1>
</div>

Avoid inline <style> tags, CSS-in-JS objects, or separate .css files, unless the user says otherwise.

Serving assets: versioned + immutable

Serve client modules with serveImmutableFile from std/utils — browsers cache them immutably, and publishing bumps the val's version, which invalidates automatically (full pattern: the client-side-js skill). A never-cached frontend/root.tsx shell (hono/jsx) stamps the entry and favicon with immutableFileUrl:

// frontend/root.tsx — in the Root() HTML shell:
<script src={immutableFileUrl("/frontend/index.tsx")} type="module" />

// index.ts:
app.get("/", (c) => c.html(Root()));
app.get("/__immutable/*", (c) => serveImmutableFile(c.req.path));

View source link

Every UI val should expose a way for users to see and remix its source. Both parts are required:

  1. Backend route:
    import { parseVal } from "https://esm.town/v/std/utils/index.ts";
    app.get("/source", (c) => c.redirect(parseVal().links.self.val));
    
  2. Visible link in the frontend:
    <a href="/source">view source</a>
    

React version pinning

A common error — "Cannot read properties of null (reading 'useState')" — means a React sub-dependency is loading a different React version. Pin all React-related imports to 18.2.0:

import SomeLib from "https://esm.sh/[email protected],[email protected]";

Assets

Do not use external images or hosted assets that may break. Prefer:

  • Emojis or unicode symbols
  • Inline SVG
  • Icon fonts via CDN (Lucide, Font Awesome)

Surfacing client-side errors

To send browser errors back to val logs (visible via get_logs), include this script in your HTML shell:

<script src="https://esm.town/v/std/catch"></script>

Verifying changes

After editing a UI val, call fetch_val_endpoint to confirm the page renders without error, then check get_logs for any client-side errors. Don't report the change as done without both.

Comments

Markdown supported