Фреймворк для консоли

Создавайте full-stack-приложения на React с рендерингом внутри console.log.

Начать

Эта страница работает в вашей консоли. Откройте её сочетанием ⌘⌥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}
viewport:3

React 19

Text.js поддерживает конкурентный рендеринг, Suspense и границы ошибок.

App Router

Папки в app/ становятся маршрутами и макетами, а «Назад», «Вперёд» и прямые ссылки работают.

Адаптивная сетка

Сетка подстраивается под закреплённую панель DevTools при любом масштабе страницы.

Ввод с клавиатуры

Нажатия клавиш, вставка и композиция IME поступают в приложение через один скрытый <textarea>.

Таблицы, графики, формы и сочетания клавиш

Вживую
preview://table:1
↑ ↓ перемещение · s сортировка · Space выбор
Документация
Макет
  • <Box>
  • <Stack>
  • <Grid>
  • <SplitPane>
  • <ScrollBox>
  • <Center>
Данные
  • <List>
  • <Table>
  • <Tree>
  • <Markdown>
  • <Code>
  • <Diff>
Графики
  • <LineChart>
  • <BarChart>
  • <Sparkline>
  • <ProgressBar>
  • <Gradient>
  • <Image>
Элементы управления
  • <Input>
  • <Select>
  • <Checkbox>
  • <Switch>
  • <Slider>
  • <Dialog>
Клавиатура
  • useKeymap
  • <KeyHelp>
  • <KeyHints>
  • <CommandPalette>
  • <StatusBar>
  • useFocus

Каждый изменённый кадр — один вызов console.log

Коммит, не изменивший ни одной ячейки, не доходит до консоли.

  1. React 19

    01Коммит

    React выполняет коммиты через собственный reconciler.

  2. Yoga

    02Макет

    Yoga размещает блоки по целым ячейкам.

  3. CellBuffer

    03Отрисовка

    Перерисовываются только повреждённые строки.

  4. Хеш строки

    04Проверка изменений

    Неизменённые кадры останавливаются здесь.

  5. RLE

    05Кодирование

    3 200 ячеек превращаются в 149 span с %c.

  6. console.log

    06Вывод

    Кадры дописываются с интервалом не менее 66 мс.

Изменённый кадр Неизменённый кадр, 0 вызовов

Дописанные кадры

Очистка консоли перед каждым кадром оставляет её пустой, пока DevTools не отрисует следующий. Turbolog вместо этого дописывает каждый кадр.

Читать статью
clear() + log()70.6 % пустых
log(), appended1.0 % пустых
0.163msПолная перерисовка (макет, отрисовка, кодирование)
0.011msПравка одной строки, например нажатие клавиши
0 вызововКадр в простое
149 spanАргументы %c для 3200 ячеек
Панель 100×32, среднее по 1000 кадрам · Apple M5 Pro · Bun 1.4.4Документация движка Turbolog

Рендеринг маршрутов на сервере

Экспортируйте runtime = "server", чтобы рендерить маршрут и его асинхронные компоненты на сервере. Браузер загружает проигрыватель кадров размером 21 КБ (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}

Писать код с OpenCode в DevTools

OpenCode Lite — это TUI OpenCode, воссозданный на Text.js для работы в консоли браузера.

Песочница

Агент по сценарию отвечает на любой промпт, без установки.

Одна команда

Запустите bunx @textjs/opencode@latest proxy и введите выведенный код. Страница подключится к OpenCode на вашем компьютере.

Ваши модели и сессии

Выберите любую настроенную на вашем сервере модель через /models. Сессии, агенты и модели поступают с вашего сервера OpenCode.

Инструменты редактора, линтинга и тестирования

Расширение DevTools

Добавляет панель с деревом компонентов, инспектором кадров и покадровой шкалой времени.

Панель Text.js

VS Code

Показывает предпросмотр кадра рядом с кодом и создаёт заготовки файлов App Router.

⌘K V

ESLint

Выявляет DOM-теги в консольных компонентах, блоки внутри текста и глифы, которых нет в Menlo.

eslint-plugin-textjs

Тестирование

Рендерьте вне экрана, нажимайте клавиши и проверяйте lastFrame() в любой среде запуска тестов.

@textjs/app/testing

Коды ошибок

Ошибки и предупреждения с кодом TX ссылаются на страницу с объяснением исправления.

TX###

REPL в консоли

Приостанавливайте, меняйте размер, включайте каркасный режим и копируйте работающее приложение из командной строки консоли.

window.text

Справа налево

Реализует двунаправленный алгоритм Unicode и проходит все 770 241 тест из BidiTest.txt.

UAX #9

Шрифты FIGlet

Разбирает файлы .flf и воспроизводит 273 результата, записанных из бинарного файла figlet.

@textjs/font