إطار عمل وحدة التحكم

أنشئ تطبيقات 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 التغييرات عبر مُصالِح مخصص.

  2. Yoga

    02التخطيط

    تخطط Yoga الصناديق على خلايا كاملة.

  3. CellBuffer

    03رسم

    تُعاد رسْم الصفوف المتضررة فقط.

  4. تجزئة الصف

    04بوابة التغييرات

    تتوقف الإطارات غير المتغيرة هنا.

  5. RLE

    05ترميز

    تتحول 3,200 خلية إلى 149 من وحدات span بصيغة ⁦%c⁩.

  6. console.log

    06إخراج

    تُلحق الإطارات بفاصل لا يقل عن 66 ms.

إطار متغير إطار غير متغير، 0 استدعاءات

الإطارات الملحقة

يترك مسح وحدة التحكم قبل كل إطار الوحدة فارغة حتى ترسم DevTools الإطار التالي. تلحق Turbolog كل إطار بدلًا من ذلك.

قراءة المقال
clear() + log()70.6% فارغ
log(), appended1.0% فارغ
0.163msإعادة رسم كاملة (تخطيط، رسم، ترميز)
0.011msتعديل صف واحد، مثل ضغطة مفتاح
0 استدعاءاتإطار خامل
149 وحدات spanوسائط ⁦%c⁩ لعدد 3,200 خلية
لوحة معلومات ⁦100×32⁩، متوسط 1,000 إطار · Apple M5 Pro · Bun 1.4.4توثيق محرك Turbolog

عرض المسارات على الخادم

صدّر 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}

البرمجة باستخدام OpenCode في DevTools

⁦OpenCode Lite⁩ هو واجهة OpenCode النصية المعاد بناؤها باستخدام Text.js لتعمل في وحدة تحكم المتصفح.

بيئة تجريبية

يجيب وكيل مبرمج مسبقًا عن أي طلب، دون تثبيت أي شيء.

أمر واحد

شغّل bunx ⁦@textjs/opencode⁩⁦@latest proxy⁩ وأدخل الرمز الذي يطبعه. تتصل الصفحة بخدمة OpenCode على جهازك.

نماذجك وجلساتك

اختر أي نموذج معدّ على خادمك باستخدام ⁦/models⁩. تأتي الجلسات والوكلاء والنماذج من خادم OpenCode الخاص بك.