React Ui

作者 val-town2d3ec654b6a7無授權條款收錄於 2026年10月8日更新於 2026年10月8日

Use when building any val with a user interface — dashboards, web apps, landing pages, forms, admin tools, anything users see in a browser. Covers JSX/React conventions, Twind/Tailwind styling, React version pinning, the view-source link requirement, and what to avoid (template-string HTML, external assets).

AI 產生的概覽

指導使用 React/JSX 元件、Twind/Tailwind 樣式、版本鎖定與原始碼連結來建構瀏覽器介面。

功能
提供以 .tsx 檔案中的 React 元件建構面向使用者介面的慣例,涵蓋檔案組織、Twind/Tailwind 工具類樣式、不可變資源服務,以及必要的檢視原始碼連結。也涉及將 React 匯入鎖定在 18.2.0、避免外部資源,以及回報用戶端錯誤。此技能僅為說明性內容,本身不產生檔案。
適用情境
適用於建構使用者在瀏覽器中看到的任何介面,例如儀表板、網頁應用程式、到達頁面、表單或管理工具。它面向以 React 為基礎的前端工作,而非僅限伺服器端程式碼。
執行需求
此技能未附帶指令碼。它假定具備 React/JSX 工具鏈、透過 CDN 引入的 Twind,以及所引用的 val 平台工具與端點,用於提供資源、取得端點與讀取日誌。

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(\<html>...</html>`)`). 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:

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

Then use Tailwind classes directly in JSX:

tsx
<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:

tsx
// 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:
    ts
    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:
    tsx
    <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:

ts
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:

html
<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.

來源與署名

來源:val-town/plugins位於plugin/skills/react-ui提交2d3ec65

授權條款: 無授權條款

內容歸原作者所有。SourceWeft 從公開儲存庫中收錄這些內容。

檢舉或申請下架