コンソールのフレームワーク
console.logの中に描画されるフルスタックのReactアプリを構築できます。
このページはコンソールで動作しています。⌘⌥JCtrl+Shift+J⌘⌥KCtrl+Shift+K⌘⌥Cで開き(先に開発者向け機能を有効化)、下のプレビューをクリックして↑ ↓を押してください。
1import { useState } from "react";2import { AsciiFont, Box, Text, useInput } from "@textjs/app";34export default function Page() {5 const [count, setCount] = useState(0);6 useInput((e) => {7 if (e.key === "up") setCount((c) => c + 1);8 if (e.key === "down") setCount((c) => c - 1);9 });1011 return (12 <Box className="flex-col gap-1 p-2">13 <AsciiFont text="▼ TEXT.JS" />14 <Text color="muted">React 19 in console.log</Text>15 <Text bold color="accent">count = {count}</Text>16 </Box>17 );18}React 19
Text.jsは並行レンダリング、Suspense、エラーバウンダリーに対応しています。
App Router
app/内のフォルダーがルートとレイアウトになり、「戻る」「進む」とディープリンクが機能します。
レスポンシブグリッド
ページのズーム倍率にかかわらず、グリッドはドッキングしたDevToolsパネルに収まります。
キーボード入力
キー入力、貼り付け、IME変換は、非表示の<textarea>を通じてアプリに届きます。
テーブル、チャート、フォーム、ショートカット
変更のあるフレームごとにconsole.logを1回呼び出し
セルに変更がないコミットはコンソールに届きません。
- React 19
01コミット
Reactはカスタムリコンサイラーを通じてコミットします。
- Yoga
02レイアウト
Yogaがボックスを整数セル単位で配置します。
- CellBuffer
03描画
変更のある行のみ再描画します。
- 行ハッシュ
04変更判定ゲート
変更のないフレームはここで止まります。
- RLE
05エンコード
3,200セルを149個の
%cスパンに変換します。 - console.log
06出力
フレームは66ms以上の間隔で追記します。
clear() + log()70.6%が空白log(), appended1.0%が空白%c引数サーバーでルートをレンダリング
runtime = "server"をエクスポートすると、ルートとその非同期コンポーネントをサーバーでレンダリングします。ブラウザーはアプリの代わりに21 kB(gzip)のフレームプレーヤーを読み込みます。
1import { Suspense } from "react";2import { Box, Text } from "@textjs/app";3import { db } from "@/lib/db";45export const runtime = "server";67async function Deploys() {8 const rows = await db.deploys.latest(5);9 return rows.map((d) => (10 <Text key={d.id}>{`${d.state} ${d.branch}`}</Text>11 ));12}1314export default function Page() {15 return (16 <Box className="flex-col p-1">17 <Text bold>Deployments</Text>18 <Suspense fallback={<Text color="muted">Loading…</Text>}>19 <Deploys />20 </Suspense>21 </Box>22 );23}- 部分的なプリレンダリング各静的ルートの最初のフレームはHTMLに含めて配信されます。JavaScriptの読み込み前にコンソールに描画されます。
- ミドルウェア
middleware.tsは一致するリクエストの前に、NextRequest、NextResponse、config.matcherを使って実行されます。 - キャッシュ
revalidate、unstable_cache、revalidateTagは、stale-while-revalidateでルートハンドラーとデータをキャッシュします。 - デプロイアダプター
text build --adapterはstatic、bun、vercel、cloudflareを対象にします。サーバーでレンダリングするルートにはbunまたはtext startが必要です。
ターミナルとエージェントでも動作
DevToolstext dev
Turbologは各フレームを%cスパンとして1回のconsole.logで書き込みます。
ターミナルtext run
text runは同じApp RouterアプリをトゥルーカラーANSIで描画し、ルートハンドラーを同一プロセス内で実行します。
コーディングエージェントtext mcp
エージェントはMCP経由でルートを移動し、キーを押し、各フレームをプレーンテキストで読み取ります。
DevToolsのOpenCodeでコーディング
OpenCode Liteは、ブラウザーのコンソールで動くようにText.jsで再構築したOpenCode TUIです。
サンドボックス
スクリプトで動くエージェントがあらゆるプロンプトに応答します。インストールは不要です。
1つのコマンド
bunx @textjs/opencode@latest proxyを実行し、表示されたコードを入力します。ページがマシン上のOpenCodeに接続します。
自分のモデルとセッション
/modelsでサーバーに設定済みのモデルを選択します。セッション、エージェント、モデルは自分のOpenCodeサーバーから取得します。
エディター、Lint、テストツール
DevTools拡張機能
コンポーネントツリー、フレームインスペクター、フレーム単位のタイムラインを備えたパネルを追加します。
Text.jsパネルVS Code
コードの横にフレームをプレビューし、App Routerファイルのひな形を生成します。
⌘K VESLint
コンソールコンポーネント内のDOMタグ、テキスト内のボックス、Menloにないグリフを検出します。
eslint-plugin-textjsテスト
任意のテストランナーで画面外に描画し、キーを押してlastFrame()を検証します。
エラーコード
TXコード付きのエラーと警告には、修正方法を説明するページへのリンクがあります。
コンソールREPL
コンソールのプロンプトから、実行中のアプリを一時停止、サイズ変更、ワイヤーフレーム表示、コピーできます。
window.text右から左への表示
Unicode双方向アルゴリズムを実装し、BidiTest.txtの全770,241ケースに合格しています。
FIGletフォント
.flfファイルを解析し、figletバイナリーから記録した273の出力と一致します。