Le framework console

Créez des applications React full-stack qui s’affichent dans console.log.

Commencer

Cette page s’exécute dans votre console. Ouvrez-la avec ⌘⌥JCtrl+Shift+J⌘⌥KCtrl+Shift+K⌘⌥C (activez les fonctionnalités de développement au préalable), cliquez sur l’aperçu ci-dessous et appuyez sur ↑ ↓.

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 prend en charge le rendu concurrent, Suspense et les périmètres d’erreurs.

App Router

Les dossiers dans app/ deviennent des routes et des layouts, et les commandes « Précédent », « Suivant » et les liens profonds fonctionnent.

Grille adaptative

La grille s’adapte au panneau DevTools ancré, quel que soit le zoom de la page.

Saisie clavier

Les touches, le collage et la composition IME parviennent à l’application via un unique <textarea> masqué.

Tableaux, graphiques, formulaires et raccourcis

En direct
preview://table:1
↑ ↓ déplacer · s trier · Space sélectionner
Documentation
Layout
  • <Box>
  • <Stack>
  • <Grid>
  • <SplitPane>
  • <ScrollBox>
  • <Center>
Données
  • <List>
  • <Table>
  • <Tree>
  • <Markdown>
  • <Code>
  • <Diff>
Graphiques
  • <LineChart>
  • <BarChart>
  • <Sparkline>
  • <ProgressBar>
  • <Gradient>
  • <Image>
Contrôles
  • <Input>
  • <Select>
  • <Checkbox>
  • <Switch>
  • <Slider>
  • <Dialog>
Clavier
  • useKeymap
  • <KeyHelp>
  • <KeyHints>
  • <CommandPalette>
  • <StatusBar>
  • useFocus

Chaque frame modifiée correspond à un appel console.log

Un commit qui ne modifie aucune cellule n’atteint jamais la console.

  1. React 19

    01Commit

    React applique les changements via un réconciliateur personnalisé.

  2. Yoga

    02Layout

    Yoga dispose les boîtes sur des cellules entières.

  3. CellBuffer

    03Affichage

    Seules les lignes modifiées sont repeintes.

  4. Hachage de ligne

    04Filtre des modifications

    Les frames inchangées s’arrêtent ici.

  5. RLE

    05Encodage

    3 200 cellules deviennent 149 spans %c.

  6. console.log

    06Émission

    Les frames sont ajoutées à la suite, espacées d’au moins 66 ms.

Frame modifiée Frame inchangée, 0 appel

Frames ajoutées à la suite

Effacer la console avant chaque frame la laisse vide jusqu’à ce que DevTools affiche la suivante. Turbolog ajoute chaque frame à la suite.

Lire l’article
clear() + log()70.6 % vide
log(), appended1.0 % vide
0.163msRendu complet (layout, peinture, encodage)
0.011msModification d’une ligne, par exemple une frappe
0 appelsFrame au repos
149 spansArguments %c pour 3200 cellules
Tableau de bord 100×32, moyenne de 1000 frames · Apple M5 Pro · Bun 1.4.4Documentation du moteur Turbolog

Rendre les routes sur le serveur

Exportez runtime = "server" pour rendre une route et ses composants asynchrones sur le serveur. Le navigateur charge un lecteur de frames de 21 ko (gzip) au lieu de votre application.

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}

Coder avec OpenCode dans DevTools

OpenCode Lite reprend l’interface textuelle d’OpenCode avec Text.js pour fonctionner dans la console de votre navigateur.

Bac à sable

Un agent scripté répond à toute requête, sans rien installer.

Une commande

Exécutez bunx @textjs/opencode@latest proxy et saisissez le code affiché. La page se connecte à OpenCode sur votre machine.

Vos modèles et sessions

Choisissez un modèle configuré sur votre serveur avec /models. Les sessions, agents et modèles proviennent de votre serveur OpenCode.