Text.jsの新着情報
Text.jsの主な変更はすべてこのファイルに記録しています。
追加
- textjs.org:スペイン語、フランス語、ドイツ語、ブラジルポルトガル語、韓国語、簡体字中国語、繁体字中国語は、textjs.org/es、/fr、/de、/pt-br、/ko、/zh-cn、/zh-twで草稿表示を終了しました。フッターの言語選択とブラウザーの言語に応じたボタンは、日本語と同様にこれらの言語を表示し、検索エンジンは翻訳済みのページをインデックスに登録して各ページを英語版と対応付けます。
- textjs.org:イタリア語、ロシア語、トルコ語、ポーランド語、インドネシア語、ベトナム語、ヒンディー語は、textjs.org/it、/ru、/tr、/pl、/id、/vi、/hiで草稿表示を終了しました。フッターの言語選択とブラウザーの言語に応じたボタンは、ほかの言語と同様にこれらの言語を表示し、検索エンジンは翻訳済みのページをインデックスに登録して各ページを英語版と対応付けます。
追加
@textjs/react:<FocusPad messages>で、翻訳されたサイト向けにパッドの組み込み文字列を置き換えられます。すべての行、スクリーンリーダーのラベル、コンソールサイズのコントロールが対象です。<TextCanvas>と<ViewportControl>もmessagesを受け取ります。<ViewportControl>が使うのはサイズコントロールのキーのみです。「次にここをクリックして↑ ↓を押します。」のように値を含む文字列は、文全体を返す関数です。defaultFocusPadMessagesには英語のテキストが入っています。フォーカスパッドの翻訳を参照してください。@textjs/react: 右から左に書くページでは、フォーカスパッドは⌘ ⌥ Jなどのキーキャップや120×36などのコンソールサイズを左から右のまま表示し、サイズコントロールとステップバーを左右反転します。中国語と日本語のページでは2つの文の間のスペースを削除し、韓国語では残します。- textjs.org:textjs.org/jaの草稿表示を終了しました。フッターの言語選択で、同じページを英語または日本語で開けます。日本語に設定されたブラウザーには「日本語で読む」ボタンが、textjs.org/jaを開いた英語のブラウザーには「Read in English」ボタンが表示されます。言語を選択するかボタンを閉じると、それ以降は表示されません。検索エンジンは翻訳済みの日本語のページをインデックスに登録し、各ページを英語版と対応付けます。
- textjs.org: textjs.org/jaでは、各デモのキーの下にあるラベルも含め、すべてのページでフォーカスパッドが日本語で表示されます。
変更
@textjs/core:ChromiumとFirefoxのコンソールは、アニメーションするスプライトの出力を4 MBではなく16 MBでクリアするため、textjs.org/doomで「コンソールがクリアされました」と表示される間隔が約4.5秒から約19秒になります。Safariと、▀のハーフブロックで描画するスプライトは、4 MBのままです。textjs.org/doomのページのヒープ使用量のピークは、10.8 MBから約12〜13 MBに増えます。- textjs.org:ドキュメントページは全33ページ分ではなく、そのページのMarkdownのみをダウンロードするため、読み込むJavaScript(gzip)が英語のドキュメントページでは43〜47 KB、/jaのドキュメントページでは60〜64 KB減ります。別のドキュメントページへのリンクにポインターを合わせるかフォーカスすると、そのページを先に取得するため、引き続きすぐに開きます。
修正
- textjs.org/ja:⌘K検索で日本語のドキュメント見出しを表示し、日本語のクエリーで見出しを検索できるようになりました。以前は、日本語のページタイトルの下に英語の見出しを表示していました。英語名でも引き続きページを検索でき、
routingで「ルーティング」、open the consoleで「コンソールを開く」が見つかります。 - textjs.org:textjs.org/jaのドキュメントの例と、textjs.org/docs/internationalizationの双方向テキストの例で、コンソール内で実行している例の変更が再びページのプレビューに反映されます。コンソール内の例の上にある行は、「▼ Docs › Introduction › Counter」から「▼ Docs › Counter」に変わりました。
追加
- textjs.org/doomで、Doom独自のステレオパンと距離減衰を使ってDoomの効果音を再生します。音はページ上で最初にクリックするかキーを押すと始まり、ゲームとともに一時停止し、DoomのOptions → Sound VolumeメニューにあるSfx Volumeに従います。音楽はありません。
変更
@textjs/react,@textjs/app: フォーカスのヒント(「キーボードを使うにはページをクリックしてください」)が、すべてのテーマで黒い太字のテキストを載せたアンバー色のバーになりました。以前はテーマの配色を反転していました。表示されるたびに約6秒間で4回点滅し、その後はアンバー色のままになります。視差効果を減らす設定がオンの場合は点滅しません。点滅の各サイクルで、最大8個の追加コンソールフレームをログに出力します。- textjs.org: Doomをtextjs.org/doomに移動しました。textjs.org/playground/doomはそこにリダイレクトします。
修正
@textjs/core,@textjs/react: Chromeの「問題」パネルで、すべてのページに「フォームフィールド要素にはid属性またはname属性が必要です」と報告されなくなりました。キーボード入力用の非表示の<textarea>にはtextjs-inputという名前が付き、ViewportControlのコンソールサイズ用<select>(FocusPadのsizeControlにも含まれます)にはidとtextjs-console-sizeという名前が付きました。キーボード入力用の<textarea>は、1Password、LastPass、Bitwarden、Dashlaneの対象からも除外されます。- textjs.org: textjs.org/doomのコンソールヘッダーを「Text.js / playground / doom」から「Text.js / doom」に変更しました。
- textjs.org/doom: 幅の狭いウィンドウで、「ソースを表示」の後に不要な「·」が残らなくなりました。
- textjs.org: 幅の狭いウィンドウで、Playgroundのデモ選択欄は最後の項目を単語の途中で切らずに、スクロール先にデモがある側の端でフェードアウトするようになりました。
- textjs.org/doomがDoom本来の毎秒35 ticで動作するようになりました。以前はレベル内で、60Hzディスプレイでは3.8×の速度(毎秒131 tic)、120Hzでは5.5×の速度(192)で動作していました。これは、Doomがレベル描画中に行う追加のクロック読み取りをページがビジーウェイトと誤認し、アニメーションフレームとタイマーのコールバックのたびにDoomのクロックを1 tic進めていたためです。
追加
@textjs/react:<Image renderMode="halfblock">は、1.3の<Image>と同様に、すべての環境で▀のハーフブロックを描画します。@textjs/core/experimental:drawPixelsは、滑らかなアルファ値と256色を超える色を持つロスレスのスプライト用にencoding: "rgba"を受け取り、スプライトを表示できない場所でセルを描画するfallback関数も受け取ります。@textjs/app:text dev、text start、およびbun、vercel、cloudflareアダプターで、curl、Wget、HTTPie、xhはHTMLページの代わりにページの最初のフレームをトゥルーカラーのANSIテキストとして取得します。text buildは静的ページのフレームをプリレンダリングします。text startとbunはリクエスト時に動的ページとサーバーレンダリングのページをレンダリングし、不明なパスにはアプリのnot-foundページと404を返します。フレームのデフォルトは80 × 24です。サイズの変更やフレームの無効化には、text.config.tsのansiまたはページのexport const ansiを使います。staticアダプターはcurlにHTMLページを配信します。curlとターミナルクライアントを参照してください。@textjs/app/ansiは、text startやアダプターを使わないサーバー向けにwantsAnsiとansiResponseをエクスポートし、@textjs/reactはframeToAnsiをエクスポートします。- textjs.org: textjs.org/jaに日本語版の草稿を追加し、はじめに、インストール、ルーティングのドキュメントとサイトのインターフェースから翻訳を始めています。未翻訳の段落は英語で表示します。検索インデックスへの登録と言語選択への追加はまだしていません。
変更
@textjs/react:<Image>がChromiumとFirefoxのコンソールでピクセルスプライトを描画するようになりました。1セルあたり、ピクセルアートでは最大8 × 16ピクセル、写真では4 × 8ピクセルです。これは、マイナーリリース間でフレームの見た目を維持するというサポートポリシーの約束を意図的に破る変更です。1.3のハーフブロックを維持するには、renderMode="halfblock"を渡します。Safari、ターミナル(text runを含む)、ANSIおよびプレーンテキスト出力、サーバーレンダリングされるページ(runtime = "server")では、引き続きハーフブロックを描画します。@textjs/app: curl、Wget、HTTPie、xhでページを取得するスクリプトや稼働監視が、ANSIテキストを受け取るようになりました。引き続きHTMLを受け取るには、Accept: text/htmlを送信するか、text.config.tsでansi: falseを設定します。@textjs/app:text buildがページのシェルをプリレンダリングする間、非同期サーバーコンポーネントは実行されなくなりました。従来どおり<Suspense>のフォールバックを表示し、ビルド時にデータリクエストを開始しません。@textjs/app: サーバーレンダリングされるページのフレームプレーヤーが3 KB小さくなり、examples/dashboardではgzip圧縮後のサイズが25.4 KBから22.4 KBになりました。CellBufferの描画メソッド、ボックスの枠線、テキストの切り詰め処理を含まなくなりました。
修正
@textjs/core: Windows 10でチャートとスピナーのグリッドを維持します。コンソールフォントのConsolasには▁▂▃▅▆▇の8分割ブロック、四分割ブロック、点字、▶、✓がなく、代替グリフによって行がフレームの右端を超えていました。CssConsoleDriverは、これらのグリフのうちコンソールフォントでセルの5分の1を超えるずれが生じるものを一度測定し、Consolasにある最も近いグリフで描画します。8分割ブロックには_▄▌█、四分割ブロックと点字にはハーフブロック、矢印、チェック、バツには►◄√×を使います。Windows 11のCascadia MonoやmacOSのMenloなど、グリフが収まるフォントでは元のグリフを描画します。measureText: falseで無効にできます。@textjs/core: ChromeとEdgeのDevToolsで、textjs.org/coffeeの「アカウント」や「数量」の横など、隣接する背景の間に1pxの縦の細線が出なくなりました。Chromiumは各%cスパンを個別にデバイスピクセルに合わせるため、2つのスパンが接するピクセルがどちらにも属さない場合がありました。CssConsoleDriverは、スパンの背景を右隣の不透明な背景の下まで1px延ばします(padding-right:1px;margin-right:-1px)。FirefoxとSafariのフレームは変わりません。@textjs/core: ChromeとEdgeの<Image>スプライトにも、テキストと同じ1pxの規則を適用します。透明なスプライトの左側にあるテキストが、スプライトの左端に1px幅の背景を重ねて描画しなくなり、スプライトの右側も反転テキストを含む不透明なテキストに隙間なく接します。行内にスプライトしかない場合も、上下のテキスト行と同様にフレームの右端まで届きます。@textjs/react:<ConsoleMirror>は、テキストの横にある写真を画像としてではなく、コンソールと同じハーフブロックで描画します。
追加
@textjs/react/experimentalはライブフレームバッファー用の<Pixels>と、押されているキーを扱うuseKeyStateをエクスポートし、@textjs/core/experimentalはdrawPixelsをエクスポートします。これらはマイナーリリースで変更される場合があります。- textjs.org/playground/doom: DevToolsコンソールでDoomのシェアウェアエピソードをプレイできます。
@textjs/react、@textjs/app: ページにフォーカスがない間、コンソールフレームの最終行に「キーボードを使うにはページをクリックしてください」と表示し、コンソール内のアプリをクリックした訪問者にキーが効かなくなった理由を伝えます。アプリにuseInputまたはusePasteのハンドラーかフォーカス対象がある場合、サーバーレンダリングされるルートを含め、ブラウザーコンソールでのみ表示します。インラインミラーとVS Codeプレビューには表示しません。無効にするには、text.config.tsまたはcreateConsoleRootでfocusHint: falseを指定します。@textjs/react:usePageFocus()はページにフォーカスがあるかどうかを返します。アプリがキーボードを必要とするタイミングを自分で決めるには、focusHint: falseを設定し、<FocusHint active={…}>をレンダリングします。useInput(handler, { ambient: true })は常時有効なショートカットを示し、それ単独ではヒントを表示しません。
変更
@textjs/core:<Pixels>スプライトのアニメーション中、ConsoleRendererはChromiumでは51msごとにキーフレームをまとめ、Safariではフレーム間隔を33msに調整し、CssConsoleDriverに追加された出力が4 MB(SPRITE_MAX_BYTES)に達すると消去します。静的スプライトとテキストのみのアプリでは、既存のフレーム間隔と300フレームの消去上限を維持します。
追加
@textjs/core:bindTextSink(element, onText)は、IMEまたはデッドキーで確定したテキストを非表示のtextareaやinputから読み取ります。読み取りは確定ごとに一度で、変換中には読み取りません。engine.bindTextSink(element)は、自分でレンダリングしたtextareaをInputEngineに接続します。どちらもリスナーを削除する関数を返します。@textjs/app:POST /__textjs/inputは、IMEとデッドキーのテキスト用に{ type: "text", text }を受け付けます。@textjs/app/frame-protocolのInputMessageとparseInputMessageにも含まれます。
変更
@textjs/app: ミドルウェアとルートハンドラーは正規化されたパスを受け取ります。/docs/と/docs//introは/docsと/docs/introとして届くため、末尾のスラッシュを追加するミドルウェアのリダイレクトは無限に繰り返されます。そのリダイレクトを削除してください。動的セグメントにエンコードされたスラッシュは含められず、/files/a%2Fbは400を返します。@textjs/app: ミドルウェアがある場合、--adapter cloudflareはハッシュ付きアセットを含むすべてのリクエストをワーカーに送り、basePathがある場合はベースパス外のリクエストも送ります。ワーカーを実行する各リクエストはFunctionsの呼び出し1回としてWorkersのリクエスト割り当てに数えられます。Workers Freeプランでは、Pagesプロジェクトをフェイルクローズに設定してください(設定→ランタイム→フェイルオープン/クローズ)。設定しない場合、1日の割り当てを使い切ると、Pagesはミドルウェアを通さずにファイルを配信します。
修正
- textjs.orgのインラインコンソールで、中国語、日本語、韓国語のIMEとデッドキーが動作します。コンソールが変換中にtextareaを消去していたため、アプリには未変換の文字や誤った文字が届いていました。
<FocusPad>はクリック後もアプリのキーボードフォーカスを維持します。以前はすぐにフォーカスが外れたため、中国語、日本語、韓国語のIMEで文字を入力できませんでした。- 文字を合成しないデッドキー(Windows、およびIMEのないLinux)も、非表示のtextareaにフォーカスがある状態でアプリに届きます。US-Internationalでは、
'の後にeを押すとé、'の後にtを押すと'tが入力されます。InputEngineがデッドキーを完了するkeydownをブロックしていたため、ブラウザーは何も挿入しませんでした。@textjs/coreのDeadKeyTrackerはそのkeydownを通し、VS Codeプレビューもこれを使います。 - VS Codeプレビューは、以前は破棄していたIMEとデッドキーのテキストを届け、デッドキーやIME変換中のキー入力をアプリに転送しなくなりました。
@textjs/app1.1.0以前のtext devサーバーでは、テキストをキー入力または貼り付けとして送信します。 @textjs/core:InputEngine.handleTextInputは、キー入力や貼り付けと同様に、shouldCaptureがfalseを返す間はテキストを無視します。text devは@textjs/app/live-stubと@textjs/app/live-playerを事前にバンドルします。runtime = "server"のページがあるアプリでは、最初のページ読み込み後に初めてこれらが見つかり、Viteが読み込み中に再バンドルしていたため、古いチャンクへの404と、Reactの重複による「無効なフック呼び出し」が発生していました。- Windowsでチャートとスピナーがフレーム内に収まります。Consolasには▁▂▃▅▆▇のブロック、四分割ブロック、点字、▶、✓がないため、Windowsは最大1.8セル幅の代替フォントで描画し、チャートの行がフレームの右端を超えていました。コンソールのフォントスタックは
"SF Mono",Menlo,"Cascadia Mono",Consolas,monospaceになり、Windows 11ではフレーム全体をCascadia Monoで描画します。<ConsoleMirror>、VS Codeプレビュー、DevTools拡張機能のフレームビューも、Consolasより前にCascadia Monoを指定します。 @textjs/opencode: WindowsのNode環境で、ブリッジがnpm i -g opencode-aiでインストールされたOpenCodeを見つけます。Nodeはnpmのopencode.cmdシムを名前で起動できないため、ブリッジはOpenCodeが未インストールであるかのように動作していました。現在は各PATHEXT拡張子でPATHを検索し、cmd.exe経由で.cmdシムを実行します。Bun(bunx)ではすでに動作していました。- Windowsで
text buildが動作します。以前はすべてのテンプレートでCould not resolve entry module "virtual:textjs/api"が出るか、エラーメッセージなしで失敗していました。 text buildは、コンソールシェルのプリレンダリングやサーバーレンダリングされるルートのビルドが失敗した場合、エラーを表示します。以前はViteの「ビルド失敗」の行の後、理由を表示せずにコード1で終了していました。- Windowsの
text devは、ファイルを編集するとサーバーレンダリングされるルートを再レンダリングし、ページのruntimeエクスポートが変わるとブラウザーを再読み込みします。 - Windowsの
text devは、/app/page.tsxなどViteがモジュールとして配信するソースファイルに対してmiddleware.tsを実行しなくなり、認証リダイレクトで開発クライアントが壊れなくなりました。 - プロジェクトパスに
C:\Users\RUNNER~1などのWindows 8.3短縮名が含まれる場合も、text runとtext mcpが動作します。以前はCLIとアプリが@textjs/appを二重に読み込むため、「アプリケーションエラー」と表示されていました。 - Windowsでビルドした
dist/は、LinuxとmacOSでもプリレンダリング済みページを配信します。ライブルートのマニフェストがパスをバックスラッシュで保存していました。 text.config.tsのviteオプションでbuild.rollupOptions.inputを設定しても、text buildが動作します。以前はその入力がAPI、サーバーレンダリングされるルート、アダプターの各バンドルのエントリーを置き換え、ビルドが失敗していました。- ページ読み込み後の最初の数秒間に停止した場合も
text devが終了し、server.close()が解決します。以前は、新たに検出された依存関係の最適化中にViteを閉じると、終了処理が完了しませんでした(vitejs/vite#22934)。
セキュリティ
@textjs/app1.1.0以前では、保護されたパスを/ad%6din、/api//admin、/admin%2Fxなど別の形式で記述すると、リクエストがmiddleware.tsを回避できました。ミドルウェアは送信されたままのパスを照合する一方、ページ、ルートハンドラー、静的ファイルはデコード後のパスで検索していました(ルートハンドラーでは2回デコード)。これはtext dev、text start、および--adapter bun、vercel、cloudflareのビルドに影響しました。静的ビルドはミドルウェアを使えないため、影響はありません。1.2.0に更新し、再ビルドして再デプロイしてください。Vercelでは.vercel/output、Cloudflare Pagesではdist/、Bunではdist/全体が対象です(サーバーを再起動してください)。独自のURLでまだアクセスできる古いデプロイは削除するか、保護してください。- すべてのホストがリクエストごとに1つの正規化されたパス名を算出し、マッチャー、
request.nextUrl、すべての検索に使います。パーセントエスケープをデコードし、new URL()と同じ形式でパスを再エンコードし、.と..のセグメントを解決し、重複するスラッシュと末尾のスラッシュを削除します。%2F、%5C、または不正なパーセントエンコーディングを含むパスには400を返します。text dev、text start、Bunアダプターは正確な名前でのみ静的ファイルを配信するため、macOSとWindowsで/ADMIN/report.txtがpublic/admin/report.txtを配信しなくなりました。 - マッチャー、書き換え元、ルートセグメント、
basePathはリクエストパスと同じエンコード形式で比較されるため、matcher: "/café/:path*"と"/caf%c3%a9/:path*"は/caf%C3%A9を保護し、"/ops%40corp/:path*"は/ops@corpを保護します。マッチャーのないミドルウェアはbasePathの外では実行されません。/admin/など末尾にスラッシュがあるマッチャーは/adminに一致し、host条件はホスト名の末尾のドットを無視します。 runtime = "server"ルートのライブセッションは、ミドルウェアが/restrictedから/loginへの書き換えなどで別のパスやクエリーに書き換えたページや、NextResponse.next({ status: 403 })などのエラーステータスで応答したページをレンダリングしません。--adapter vercel: ルートハンドラー関数は、生成されたルートのみが設定するリクエストヘッダーからパスを取得するため、/api/x/%252e%252e/adminが/api/adminに到達しなくなり、/_textjs/*をどのように表記しても関数は実行されません。生成されたルートは大文字と小文字を区別して照合するため、ミドルウェアが検査していない/LEGACY/xが/legacy/:path*の書き換えに一致しなくなりました。{などの未エンコード文字を含む、正規化されていない可能性のあるすべてのパスはエッジミドルウェアを通ります。このミドルウェアはすべてのVercelビルドに含まれ、リクエストを正規化されたパスに書き換えます。--adapter cloudflare: 静的ファイルはエンコードされたパスで検索されるため、/x/%252e%252e/admin/report.txtが/admin/report.txtを配信しなくなりました。basePathがある場合、その外側のファイルがワーカーを通さずに配信されることもなくなりました。text devは、/public/…や/@fs/…でのpublic/ファイルの配信、middleware.tsやtext.config.tsなどのサーバー専用ソースの大文字と小文字を変えた指定、エンコードされた/@fs/パス、拡張子なしのモジュールリクエスト(/text.config?import)、設定による書き換えを通じた配信、およびbasePath外のルートハンドラーの配信をしません。
追加
- Text.jsはFirefoxとSafariのコンソールでレンダリングします。
CssConsoleDriverはCSS機能のチェックでブラウザーを検出します。%cスパンがインラインのままになる環境では、マージンなしで行高14pxを指定し、ソフトラップを無効にし、line-height: 100vhのカーテンを使います。 - レスポンシブなサイズ調整は、Firefoxのソースリンク列のスペースを確保します。Safariではフォントスタックの先頭にMenloを置きます。WebインスペクタではユーザーがインストールしたSF Monoで描画できても、ページからは使えないためです。
- コンソールを選ぶには、
createConsoleRoot、ConsoleRenderer、CssConsoleDriverにbrowser: "chromium" | "firefox" | "safari"を渡します。 - プリレンダリングされたシェルには、両方の種類のコンソール用CSSが含まれます。
<FocusPad>は訪問者のブラウザー用のコンソールショートカットを表示します。Firefoxでは⌘⌥KまたはCtrl+Shift+K、Safariでは⌘⌥Cと「Webデベロッパ用の機能を表示」を有効にする案内を表示します。- プリレンダリングされた
<FocusPad>は、すべてのブラウザーのショートカットをレンダリングします。最初の描画前に<html>にdata-browser(firefoxまたはsafari)とdata-os(mac)を設定すると、訪問者に合うものだけを表示します。未設定の場合は、ハイドレーションまでChromeのWindows・Linux用ショートカットを表示します。
修正
- ⌘⌥KとCtrl+Shift+K(Firefoxのコンソールショートカット)は、アプリに届かずブラウザーに渡されます。
- レスポンシブなサイズ調整は、DevToolsが閉じている間に高さ60px未満のブラウザーツールバー(SafariとFirefox)の高さを学習し、下部にドッキングしたコンソールに収まるすべての行を表示します。
<FocusPad>は学習した高さでDevToolsがドッキングされているかを判定します。 <FocusPad>はクリック待ちの状態で、WindowsとLinuxのショートカットをCtrl+Shift+Jと表示します。
セキュリティ
@textjs/opencode: ブリッジは起動時にペアリングコードを表示し、textjs.org/opencodeは初回接続時にその入力を求めます。ページがコードを送信するまで、ブリッジは許可されたオリジンにも428を返し、OpenCodeには何も転送しません。各コードはブリッジの1回の起動中のみ有効で、返されるトークンはペアリングしたオリジンからのみ使え、コードを10回間違えるとブリッジを再起動するまでペアリングがロックされます。@textjs/opencode: textjs.orgのCloudflare Pagesプレビューデプロイは、デフォルトで許可されなくなりました。使うには--allow-originを渡します。- textjs.org/opencodeは
@textjs/opencode1.0.xのブリッジを拒否します。bunx @textjs/opencode@latest proxyを実行してください。 - textjs.orgはContent-Security-Policy、
Strict-Transport-Security、Cross-Origin-Opener-Policy、Cross-Origin-Resource-Policyを送信します。OpenCodeページは127.0.0.1またはlocalhostのサーバーにのみ接続します。
- Text.jsはFirefoxとSafariのコンソールでレンダリングします。
追加
- OpenCode Lite: ファイルごとの差分の確認、プロンプト履歴の閲覧、リーダーキーのショートカットの設定、プロバイダーアカウントとMCPサーバーの管理に対応します。サンドボックスには、スクリプトで動作するターミナルペインが含まれます。
- OpenCode Lite:
/を入力するとコマンドを検索し、@を入力するとプロジェクトファイルを添付します。Tabはファイルメニューでディレクトリーを開きます。接続中のセッションはサーバーのプロジェクトを検索し、サンドボックスはサンプルリポジトリを検索します。 - textjs.org/coffee: terminal.shopのデモはSSHアプリと同様にコンソールサイズに追従し、小・中・大のレイアウトと、20 × 10未満での「ターミナルが小さすぎます」の表示に対応します。アカウントには、支払い方法、名前を編集できるプロフィール、サブスクリプションの週次スケジュール変更を追加します。サインアウト中も、カートとアカウント内のよくある質問、概要、デバッグ情報をサインインせずに開けます。
パフォーマンス
@textjs/react:BoxとTextは、マウント時と更新時にpropsオブジェクトをコピーする代わりに、不要なプロパティーを事前に除去したシーンのpropsをリコンサイラーに渡します。@textjs/core:SceneNode.getTextModel()は、単一文字列の<Text>リーフでインラインツリーの走査を省略し、キャッシュされたゼロ初期化済みのUint16ArrayのrunOfバッファーを再利用します。CssConsoleDriverはスタイルが一致する連続したBMPセルを内部ループで走査し、ConsoleRendererは変更のないフレームでcountYogaNodes()を省略します。- textjs.org: ルートとコンソールコンパニオンのタブを、ルートごとのJSとCSSのチャンクに分割しました。ストアの写真は
photos/finalのマスターから再エンコードし、追加の商品写真はホバー時またはスライドの切り替え時に読み込みます。
修正
<ViewportControl>は20chの代わりにピクセル単位のminWidthを使い、<FocusPad>と同じメトリクスを合わせた代替フォントを指定するため、Geist Monoの読み込み時もサイズ選択の幅を維持します。
追加
@textjs/opencode: textjs.org/opencodeのブリッジを、依存関係のない独立したパッケージにしました。Vite、React、MCP SDKをインストールせずに起動するには、bunx @textjs/opencode proxy(またはnpx)を実行します。text proxyも引き続き使え、同じブリッジを実行します。
変更
- フレームワークとCLIのパッケージは
@textjs/appになりました。公式のNext.js統合を示す名前にならないよう、@textjs/nextから改名しました。@textjs/nextは@textjs/appに置き換えられて非推奨となり、新しいリリースはありません。移行するには、bun remove @textjs/next && bun add @textjs/appを実行し、@textjs/app/linkなどのサブパスを含め、インポート内の@textjs/nextを@textjs/appに置き換えます。CLIは引き続きtextで、create-text-appのテンプレートは@textjs/appに依存します。 - コンソール内の
[▼]ピルとインスペクターの名称はDev Overlayで、インスペクターのタイトルは▼ Dev Overlay · Turbologです。Text.js DevToolsはChrome拡張機能のみの名称です。<TextDevOverlay>とそのpropsは変わりません。 dynamic = "error"をエクスポートするルートハンドラーはTX031で失敗します。Text.jsは、Next.jsでこの値が意味するリクエスト読み取りの有無の確認をせず、"force-static"として扱っていました。"force-static"を使ってください。
修正
text startはtext devと同様に、ブロックされたHostにTX028を返します。各サーバーは参照する設定名を示します。text devはvite.server.allowedHosts、text startはserver.allowedHostsです。- textjs.org: 学習コースの公開の章で、
vercel.jsonの書き換えを追加するよう案内しなくなりました。VercelとCloudflare Pagesでは、text build自体がindex.htmlのフォールバックを書き出します。書き換えの例はNetlifyの_redirectsを使います。 eslint-plugin-textjs:route-handler-exportsはroute.tsでのdynamicとrevalidateのエクスポートを許可し、valid-route-moduleはそこでのdynamicの値を検査します。
追加
- textjs.org: 学習コースの章の動画を再生中にスクロールして通り過ぎると、隅のミニプレーヤーに移動します。各動画の下にある「字幕」ボタンは字幕の表示を切り替え、選択を記憶します。
<TextDevOverlay>はpill、shortcut、shellのpropsを受け取り、App Routerを使わないアプリも独自のキーとテーマ操作でインスペクターをマウントできます。<FocusPad>はbannerを受け取り、メッセージの最初の行(アプリのワードマークなど)として、タッチデバイスでは注意書きの上に表示します。
変更
- textjs.org: Playgroundの選択メニューには、ダッシュボード、ストリーミング、スネーク、OpenCode、コーヒー(terminal.shop)が並びます。各デモには独自のURLがあり、OpenCodeは
/opencode、terminal.shopは/coffeeで、メッセージの先頭にそれぞれのワードマークを表示します。カウンターとフォームはPlaygroundから移動しましたが、ドキュメントでは引き続きライブサンプルとして動作します。 <FocusPad>のレイアウトを刷新しました。各状態では、3分割の進捗バー、見出し、大きな要素1つ、1行のテキストを表示します。コンソールを開く前は、大きな要素としてDevToolsのショートカットを表示します。クリック待ちではポインターを表示します。動作中はアプリのhintsをキーキャップとして表示し、キー入力に応じて点灯させ、ヒントのないキーはその下に表示します。ステップのラベル、独立した「動作中」バッジ、「コンソールを見てください。」の行は削除しました。行は状態の変化時にフェードインし、初回描画時にはフェードインせず、prefers-reduced-motionでは動きを無効にします。補助テキストは両方の外観でWCAG AAのコントラストを満たし、コンソールのサイズ選択にキーボードで移動するとフォーカスリングを表示します。- textjs.org: Playgroundは新しい
<FocusPad>レイアウトを使います。選択メニューの現在のデモはキーキャップと同じ背景を使い、OpenCodeのコマンド欄はURL欄と角の形状と文字サイズを揃え、terminal.shopの注記は3行から2行にし、「ソースを表示」はサイズコントロールのベースラインに揃え、パッド内の控えめなテキストはAAコントラストを満たします。
修正
text devはすべてのリクエストでproxyパスをプロキシ経由で配信します。fetch()はAccept: */*を送信するため、以前は開発サーバーが先にアプリのHTMLを返し、opencodeテンプレートの初回実行が「予期しないトークン '<'」で失敗していました。- Viteの依存関係スキャンがサーバー専用ファイルを読んでも、
text devはReactを二重に読み込まなくなりました。以前はスキャンがサーバー専用インポートの検査に引っかかり、スタックトレースの後にコンソールへ「無効なフック呼び出し」を出力し、Fast Refreshを壊していました。 text devは/?demoなどクエリー文字列付きのページURLを処理します。以前はViteがこれらをプロジェクトフォルダーとして扱ってディスク全体を監視し、Linuxでページが読み込まれませんでした。- create-text-app: すべてのテンプレートの初期画面で開発用ピルが最初のキーヒントを覆わなくなり、デフォルトのプロジェクト名をドキュメントに合わせて
my-appにし、テンプレートはeslint-plugin-textjsの推奨設定を通過し、dashboardのREADMEでは--adapter staticビルドを説明します。 <FocusPad>と<ViewportControl>は個別指定プロパティだけで境界線を設定します。以前は開発時にキーヒントが点灯するたび、Reactが「再レンダリング中にスタイルプロパティを更新しています(border)」と警告していました。- 行の最後のテキストは、短くなっても位置を維持します。以前は
<Spacer>の後で最長のテキストがあった位置に留まり、はみ出す行に収めるため縮小された兄弟要素も縮小されたままでした。 <FocusPad>はactionまたはhintsが変わるとステップ、サブタイトル、キーの行を置き換えるため、同じパッドでのデモ切り替えがレイアウトシフトとして報告されません。@textjs/react/testingはインポート時にYogaを読み込むため、テストで最初のrender()の前にfetchをスタブ化できます。
最初の安定版リリースです。
▼ Text.js 1.0.0 (Turbolog)。変更
- 破壊的変更: フレームワークとCLIのパッケージは
@textjs/nextになりました(npmではtextjsが使用済みです)。インポートをtextjsから@textjs/nextに更新してください。 - OpenCodeブリッジは
bunx @textjs/app proxyで、どのディレクトリーからでも実行できます。 - コンソールはデフォルトで、ドッキングされたDevToolsパネルに収まります(下・左・右へのドッキング、ページズーム、ツールバーの折り返しに対応)。ドッキングされていないDevToolsでは
120×36にフォールバックします。パッドにサイズコントロールを追加しました。
追加
- 自動の
?ヘルプ画面、キーヒント、Ctrl+Kコマンドパレットを備えたuseKeymap。 - データコンポーネント:
List(仮想化)、Table、Tree。 - チャート:
LineChart、BarChart、Sparkline、ProgressBar、およびGradientとImage。 - コントロール:
Button、Checkbox、Switch、RadioGroup、Slider、Dialog、Confirm、トースト。 - レイアウト:
Center、Stack、Grid、SplitPane、FocusScope。 - タイマー、アニメーション、計測、ブレークポイント、ストレージ、クリップボード用のフック。
- 右から左へのテキスト。Text.jsはUnicode双方向アルゴリズム(UAX #9、Unicode 18.0)を実装し、
BidiTest.txtの770,241件とBidiCharacterTest.txtの91,707件の全テストに合格します。アラビア文字の字形を整え、<Text dir>はスパンを分離します。 - 安定した
TX###エラーコード。フレームワークのエラーにはコードとhttps://textjs.org/errors/<code>へのリンクが付きます。 - テストでコンポーネントをテキストにレンダリングする
@textjs/react/testing。 - App Routerアプリを実際のターミナルでレンダリングする
@textjs/react/terminalとtext run。 - Model Context Protocol経由でアプリを提供し、コーディングエージェントがブラウザーなしで移動、キー入力、フレームの読み取りをできる
text mcp。 - コンソールの隣にコンポーネントツリー、フレームインスペクター、タイムラインのパネルを追加するText.js DevTools拡張機能。
eslint-plugin-textjsとライブプレビュー付きのVS Code拡張機能。apps/terminal-shop: 実際のAPIを使う、コンソール内のterminal.shopストアフロント(デフォルトは開発用サンドボックス、本番環境は二重ロック)。- textjs.org: コンソールで動く全10章の学習コース。ハイドレーション付きのビルド時プリレンダリング、セルフホストのメトリクスを合わせたフォント、スラッシュなしの
.htmlルート、ライブプレビュー付きの新しいドキュメントページ。
パフォーマンス
- 消去後のDevToolsのスロットル位相ロックを解消しました。消去するフレームの後、レンダラーは一度だけ110ms待機し、以降のフレームがDevToolsの即時描画経路に入るようにします。表示遅延のp50は63msから10msになりました。
- 変更帯域の部分描画:変更の影響を受けた行の帯域だけを再描画します。
- 行ごとのハッシュのキャッシュ、整数のスタイルID、アロケーションなしのアイドルフレーム。
- ページが非表示またはフォーカスされていない間のアイドルタイマーはゼロ。
修正
- 改行位置に不要な空の描画レイヤースパンが生じず、カーテンも二重になりません。
- カーテンを独立した行に置くため、DevToolsのソースリンク(
VM12:1)が行0を折り返すことはありません。 - デフォルトのスピナーはセルに正確に収まります(Menloには点字グリフがありません)。
brailleバリアントは明示的に選択します。 - Nodeの
text buildはReactの開発用ビルドをバンドルしなくなりました。 - textjs.org: すべてのルートで累積レイアウトシフトが0です。PlaygroundとOpenCodeは同じパッドレイアウトを共有します。
- textjs.org: ドキュメントと学習コースのサイドバーは、長いページの下部でも固定されたままです。
- textjs.org: ファイルタブ、コードブロック、本文の表は横方向にのみスクロールし、iOS Safariでページの縦スワイプを奪いません。
- textjs.org:
scrollbar-gutter: stableはマウスデバイスにのみ適用します。iOS Safariでは最初のスクロールが飛ぶ原因になっていました。 - textjs.org: スクロールアンカーを無効にしました。iOS Safariではヒーローを固定ヘッダーの下に留めていました。
- 破壊的変更: フレームワークとCLIのパッケージは
ちらつきのないフレームとサーバーレンダリング。
変更
- フレームごとの
console.clear()+console.log()の代わりに、フレームを追加します。DevToolsは消去を同期的に適用しますが、新しいメッセージの描画には50msのスロットルがあるため、消去すると15fpsではDevToolsの描画の70.6%、60fpsでは81.1%でコンソールが空白になっていました。先頭の幅ゼロのカーテンスパンが以前のフレームを隠します。コンソールを消去するのは、最初のフレーム、invalidate()の後、100フレームが積み重なった後のアイドル時、または300フレーム時だけです。 - 出力するフレームの間隔を最低66ms(約15fps)に調整します。それより速いフレームはDevToolsのスロットルを再開させて破棄されます。60fpsでは、出力した295フレームのうちDevToolsが描画したのは67フレームでした。
- PlaygroundとOpenCodeは全画面のフォーカスパッドです。
パフォーマンス
- スパンのCSSを個別指定プロパティのみにし、DevToolsが各行にコピーするプロパティを約33から約7に減らします。16進数カラーと、背景だけをキーにした空白ラン。
- インクリメンタルなMarkdown解析と、メモ化した
Markdown、Code、Diffの行。 - 1回の走査で処理するホストprops、必要なpropsのみの更新、テキストサイズが変わり得ない場合のYoga再レイアウトの省略。
- ストリーミングのフレームは0.79msから0.14msに、スピナーの1更新は0.90msから0.056msになりました。出力はビット単位で同一です。
追加
- サーバーレンダリング。
runtime = "server"をエクスポートするページは、async functionコンポーネントを含めサーバーでレンダリングし、行単位のセル差分をServer-Sent Events経由でgzip約19 kBのフレームプレーヤーにストリーミングします。 - 部分的プリレンダリング。
text buildは各静的ルートの最初のフレームをHTMLにインライン化し、モジュールの読み込み前にコンソールを描画します。 middleware.ts、ルートセグメント設定(dynamic、revalidate)、textjs/cache(unstable_cache、revalidateTag、revalidatePath)。text build --adapter static|bun|vercel|cloudflare。bench/devtools: 実際のDevToolsフロントエンドを操作し、空白の描画、フレームの欠落、表示遅延、DevToolsのCPU使用量を計測するハーネス。
修正
path:line、//host:port、data:のテキストがDevToolsによってリンク化されなくなりました。- OpenCodeブリッジは管理対象のデーモン(エフェメラルポート、Basic認証)を見つけ、書き込み時にCSRFヘッダーを送信し、失敗を1行で報告します。
- フレームごとの
変更
- 個別の入力(キー入力、貼り付け)は、次のアニメーションフレームを待たず、同じタスク内で同期的にレンダリングします。
- 本物に合わせて機能を絞ったOpenCodeのTUI。
- textjs.org全体のモバイル対応とレスポンシブ対応の見直し。
追加
@textjs/font:<FigletText>と<AsciiFont>用の、17フォントを同梱したFIGletフォントパーサーとレンダラー。出力はfiglet2.2.5バイナリーから記録した273件の参照結果と一致します。text proxy: textjs.orgがOpenCodeサーバーと通信するためのローカルCORSブリッジ。
追加
apps/opencode-console:console.logに描画する接続型のOpenCodeクライアントです。サーバーが稼働していない場合はデモにフォールバックします。create-text-app用のopencodeテンプレートです。- textjs.org:新しいランディングページ、ライブコンソールコンパニオン、Playground、OpenCodeページ、ドキュメントです。
- 静的ルート生成に対応したGitHub Pagesデプロイワークフローです。
最初のマイルストーンです。
追加
@textjs/core: フラットな型付き配列上のCellBuffer、Yoga WASMレイアウト、Intl.Segmenterによるテキスト計測、%cランレングス符号化ドライバー。変更のあるフレームごとにconsole.logを1回呼び出し、アイドル時は呼び出しなし。@textjs/react: React 19リコンサイラー、PascalCaseコンポーネント(Box、Text、ScrollBox、Input、Textarea、Select、Tabs、Code、Markdown、Diff、Modal、Spinnerなど)、セル単位のTailwind風classNameユーティリティー、テーマ、DOMのFocusPad。textjs: ファイルシステムベースのApp Router(layout、page、loading、error、not-found、動的セグメント、ルートハンドラー)、text dev、text build、text start、コンソール内の[▼]インスペクター。starterとdashboardテンプレートを備えたcreate-text-app。