تازه‌های Text.js

همهٔ تغییرات مهم Text.js در این فایل ثبت شده‌اند.

  1. منتشرنشده

    افزوده‌ها

    • ⁦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.org: نسخه‌های عربی، عبری، فارسی و اردو در ⁦textjs.org/ar⁩، ⁦/he⁩، ⁦/fa⁩ و ⁦/ur⁩ از حالت پیش‌نویس خارج شده‌اند. انتخابگر زبان پابرگ و دکمهٔ زبان مرورگر، مانند زبان‌های دیگر، این زبان‌ها را ارائه می‌کنند. موتورهای جست‌وجو صفحه‌های ترجمه‌شده را نمایه‌سازی می‌کنند و هرکدام را با نسخهٔ انگلیسی آن تطبیق می‌دهند.

    تغییرات

    • @textjs/react: کامپوننت‌های <FocusPad> و <ViewportControl> برچسب‌های تک‌عرض خود را با مجموعه‌فونت --mono صفحه نمایش می‌دهند، اگر صفحه آن را تعریف کرده باشد، و مانند قبل در نبود آن از ⁦Geist Mono⁩ استفاده می‌کنند. صفحه‌ای با برچسب‌های عربی یا عبری می‌تواند فونت‌های خط خود را به --mono اضافه کند.

    رفع اشکال‌ها

    • ⁦textjs.org⁩: در تلفن‌ها، کد درون‌خطی بلندتر از خط، به‌جای عریض کردن صفحه به خط بعد می‌رود. عرض ⁦textjs.org/docs/internationalization⁩ در صفحه‌نمایش 390 px، به‌اندازهٔ 92 px بیش از حد بود.
  2. v1.5.0

    افزوده‌ها

    • @textjs/react: کامپوننت <FocusPad messages> برای سایت‌های ترجمه‌شده، هرکدام از رشته‌های داخلی پد را جایگزین می‌کند. این قابلیت همهٔ سطرها، برچسب‌های صفحه‌خوان و کنترل اندازهٔ کنسول را پوشش می‌دهد. کامپوننت‌های <TextCanvas> و <ViewportControl> نیز messages را می‌پذیرند. کامپوننت <ViewportControl> فقط از کلیدهای کنترل اندازه استفاده می‌کند. رشته‌هایی که مقداری در خود دارند، مانند «سپس اینجا کلیک کنید و ↑ ↓ را فشار دهید.»، تابع‌هایی هستند که جملهٔ کامل را برمی‌گردانند. متن انگلیسی در defaultFocusPadMessages قرار دارد. ترجمهٔ پد فوکوس را ببینید.
    • @textjs/react: در صفحه‌های راست‌به‌چپ، پد فوکوس کلیدهایی مانند ⁦⌘ ⌥ J⁩ و اندازه‌های کنسول مانند ⁦120×36⁩ را چپ‌به‌راست نگه می‌دارد و کنترل اندازه و نوار مراحل را قرینه می‌کند. در صفحه‌های چینی و ژاپنی، فاصلهٔ میان دو جملهٔ خود را حذف می‌کند؛ در کره‌ای این فاصله حفظ می‌شود.
    • textjs.org: نسخهٔ ⁦textjs.org/ja⁩ از حالت پیش‌نویس خارج شده است. انتخابگر زبان پابرگ، همان صفحه را به انگلیسی یا ژاپنی باز می‌کند. مرورگری که زبانش ژاپنی است دکمهٔ «خواندن به ژاپنی» را نشان می‌دهد و مرورگر انگلیسی در ⁦textjs.org/ja⁩ دکمهٔ «خواندن به انگلیسی» را نشان می‌دهد. پس از انتخاب زبان یا بستن دکمه، دیگر نمایش داده نمی‌شود. موتورهای جست‌وجو صفحه‌های ترجمه‌شدهٔ ژاپنی را نمایه‌سازی می‌کنند و هرکدام را با نسخهٔ انگلیسی آن تطبیق می‌دهند.
    • textjs.org: در ⁦textjs.org/ja⁩، پد فوکوس در همهٔ صفحه‌ها ژاپنی است، از جمله برچسب‌های زیر کلیدهای هر دمو.

    تغییرات

    • @textjs/core: کنسول‌های Chromium و Firefox خروجی اسپرایت متحرک را در 16 MB به‌جای 4 MB پاک می‌کنند، بنابراین ⁦textjs.org/doom⁩ پیام «کنسول پاک شد» را حدود هر 19 ثانیه به‌جای هر 4.5 ثانیه نشان می‌دهد. Safari و اسپرایت‌هایی که با نیم‌بلوک‌های ▀ رسم می‌شوند، همان 4 MB را نگه می‌دارند. اوج حافظهٔ هیپ صفحه در ⁦textjs.org/doom⁩ از 10.8 MB به حدود ⁦12–13⁩ MB می‌رسد.
    • textjs.org: هر صفحهٔ مستندات فقط Markdown خودش را به‌جای هر 33 صفحه بارگیری می‌کند، بنابراین صفحه‌های مستندات انگلیسی ⁦43–47⁩ KB جاوااسکریپت کمتر (gzip) و صفحه‌های مستندات ⁦/ja⁩ مقدار ⁦60–64⁩ KB کمتر بارگیری می‌کنند. قرار دادن نشانگر روی پیوند صفحهٔ دیگری از مستندات یا فوکوس کردن آن، آن صفحه را زودتر دریافت می‌کند تا همچنان بی‌درنگ باز شود.

    رفع اشکال‌ها

    • ⁦textjs.org/ja⁩: جست‌وجوی ⁦⌘K⁩ عنوان‌های ژاپنی مستندات را نشان می‌دهد و پرس‌وجوهای ژاپنی را با آن‌ها تطبیق می‌دهد. پیش‌تر عنوان‌های انگلیسی را زیر عنوان صفحه‌های ژاپنی فهرست می‌کرد. نام‌های انگلیسی همچنان صفحه‌ها را پیدا می‌کنند: routing مسیریابی را پیدا می‌کند و open the console باز کردن کنسول را پیدا می‌کند.
    • textjs.org: نمونهٔ مستنداتی که در کنسول شما اجرا می‌شود، دوباره تغییراتش را در پیش‌نمایش صفحه در ⁦textjs.org/ja⁩ و برای نمونهٔ متن دوجهته در ⁦textjs.org/docs/internationalization⁩ نشان می‌دهد. سطر بالای نمونه در کنسول اکنون به‌جای «▼ مستندات › مقدمه › شمارنده»، «▼ مستندات › شمارنده» است.
  3. v1.4.1

    افزوده‌ها

    • ⁦textjs.org/doom⁩ جلوه‌های صوتی Doom را با جابه‌جایی استریو و کاهش صدا برحسب فاصلهٔ خود Doom پخش می‌کند. صدا با نخستین کلیک یا فشردن کلید در صفحه شروع می‌شود، همراه بازی متوقف می‌شود و از گزینهٔ حجم جلوه‌های صوتی در منوی گزینه‌ها ← حجم صدا در Doom پیروی می‌کند. موسیقی ندارد.

    تغییرات

    • @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 نام دارد و عنصر <select> اندازهٔ کنسول در ViewportControl (همچنین در sizeControl کامپوننت FocusPad) دارای 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⁩ با نرخ 35 تیک در ثانیهٔ Doom اجرا می‌شود. در یک مرحله، روی نمایشگر 60 Hz با سرعت 3.8 برابر (131 تیک در ثانیه) و روی نمایشگر 120 Hz با سرعت 5.5 برابر (192) اجرا می‌شد، زیرا صفحه خواندن‌های اضافی ساعت را که Doom هنگام ترسیم مرحله انجام می‌دهد با انتظار فعال اشتباه می‌گرفت و در هر فریم پویانمایی و فراخوانی بازگشتی زمان‌سنج، ساعت Doom را یک تیک جلو می‌برد.
  4. v1.4.0

    افزوده‌ها

    • @textjs/react: کامپوننت <Image renderMode="halfblock"> همه‌جا نیم‌بلوک‌های ▀ را رسم می‌کند، همان‌طور که <Image> در 1.3 انجام می‌داد.
    • @textjs/core/experimental: تابع drawPixels مقدار encoding: "rgba" را برای اسپرایتی بدون اتلاف با آلفای نرم و بیش از 256 رنگ می‌پذیرد و یک تابع fallback که هرجا نمایش اسپرایت ممکن نباشد سلول‌ها را رسم می‌کند.
    • @textjs/app: ابزارهای curl، Wget، HTTPie و xh در text dev، text start و آداپتورهای bun، vercel و cloudflare، نخستین فریم صفحه را به‌صورت متن ANSI با رنگ واقعی به‌جای صفحهٔ HTML دریافت می‌کنند. دستور text build فریم‌های صفحه‌های ایستا را پیش‌رندر می‌کند. دستور text start و آداپتور bun صفحه‌های پویا و رندرشده در سمت سرور را هنگام درخواست رندر می‌کنند و به مسیرهای ناشناخته با صفحهٔ پیدا نشد برنامه و کد 404 پاسخ می‌دهند. اندازهٔ پیش‌فرض فریم‌ها ⁦80 × 24⁩ است. با ansi در text.config.ts یا export const ansi در یک صفحه، اندازه را تغییر دهید یا فریم‌ها را غیرفعال کنید. آداپتور static صفحهٔ HTML را به curl ارائه می‌کند. curl و کلاینت‌های ترمینال را ببینید.
    • @textjs/app/ansi تابع‌های wantsAnsi و ansiResponse را برای سرورهایی که از text start یا آداپتور استفاده نمی‌کنند صادر می‌کند و @textjs/react تابع frameToAnsi را صادر می‌کند.
    • textjs.org: نسخهٔ پیش‌نویس ژاپنی در ⁦textjs.org/ja⁩، با شروع از مستندات مقدمه، نصب و مسیریابی و رابط سایت. بندهای ترجمه‌نشده به انگلیسی نمایش داده می‌شوند. هنوز نمایه‌سازی نمی‌شود و در انتخابگر زبان ارائه نمی‌شود.

    تغییرات

    • @textjs/react: کامپوننت <Image> اکنون در کنسول‌های Chromium و Firefox یک اسپرایت پیکسلی رسم می‌کند، با حداکثر ⁦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 به‌جای 25.4 KB، برابر 22.4 KB با gzip است. دیگر متدهای رسم CellBuffer، حاشیه‌های کادر یا کوتاه‌سازی متن را همراه خود ندارد.

    رفع اشکال‌ها

    • @textjs/core: نمودارها و نشانگرهای چرخان در ⁦Windows 10⁩ شبکهٔ خود را حفظ می‌کنند. قلم کنسول آن Consolas است که بلوک‌های یک‌هشتمی ▁▂▃▅▆▇، ربع‌بلوک‌ها، بریل، ▶ یا ✓ را ندارد و گلیف‌های جایگزین آن‌ها سطرها را از لبهٔ راست فریم بیرون می‌بردند. اکنون CssConsoleDriver یک بار اندازه می‌گیرد که قلم کنسول کدام گلیف‌ها را با اختلاف بیش از یک‌پنجم سلول رسم می‌کند و آن‌ها را با نزدیک‌ترین گلیف موجود در Consolas رسم می‌کند: _ ▄ ▌ █ برای یک‌هشتم‌ها، نیم‌بلوک برای ربع‌بلوک‌ها و بریل و ► ◄ √ × برای پیکان‌ها، تیک‌ها و ضربدرها. قلم‌هایی که این گلیف‌ها در آن‌ها جا می‌گیرند، مانند ⁦Cascadia Mono⁩ در ⁦Windows 11⁩ و Menlo در macOS، شکل‌های اصلی را رسم می‌کنند. تنظیم measureText: false این قابلیت را غیرفعال می‌کند.
    • @textjs/core: دیگر خط‌های عمودی باریک 1 پیکسلی میان پس‌زمینه‌های مجاور در DevTools مرورگرهای Chrome و Edge وجود ندارند، مانند کنار «حساب» و «تعداد» در ⁦textjs.org/coffee. Chromium⁩ هر span از نوع %c را جداگانه با پیکسل‌های دستگاه هم‌تراز می‌کند و ممکن بود پیکسل محل اتصال دو span به هیچ‌کدام تعلق نگیرد. اکنون CssConsoleDriver پس‌زمینهٔ span را 1 پیکسل زیر همسایهٔ مات سمت راست گسترش می‌دهد (padding-right:1px;margin-right:-1px). فریم‌های Firefox و Safari تغییر نمی‌کنند.
    • @textjs/core: اسپرایت‌های <Image> در Chrome و Edge از همان قاعدهٔ 1 پیکسلی متن پیروی می‌کنند. متن سمت چپ اسپرایت شفاف دیگر نواری 1 پیکسلی از پس‌زمینهٔ خود را روی لبهٔ چپ اسپرایت رسم نمی‌کند و اسپرایت بدون شکاف به متن مات سمت راست، از جمله متن معکوس، می‌چسبد. اسپرایتی که در سطرهای خود تنهاست اکنون مانند سطرهای متن بالا و پایینش تا لبهٔ راست فریم می‌رسد.
    • @textjs/react: کامپوننت <ConsoleMirror> عکس کنار متن را مانند کنسول به‌صورت نیم‌بلوک رسم می‌کند، نه به‌صورت تصویر.
  5. v1.3.0

    افزوده‌ها

    • @textjs/react/experimental کامپوننت <Pixels> را برای فریم‌بافرهای زنده و useKeyState را برای کلیدهای نگه‌داشته‌شده صادر می‌کند؛ @textjs/core/experimental تابع drawPixels را صادر می‌کند. این موارد ممکن است در یک نسخهٔ فرعی تغییر کنند.
    • ⁦textjs.org/playground/doom⁩: قسمت اشتراکی Doom را در کنسول DevTools بازی کنید.
    • @textjs/react، @textjs/app: وقتی صفحه فوکوس ندارد، آخرین سطر فریم کنسول پیام «برای استفاده از صفحه‌کلید، روی صفحه کلیک کنید» را نشان می‌دهد تا بازدیدکننده‌ای که روی برنامه در کنسول کلیک می‌کند بداند چرا کلیدها دیگر کار نمی‌کنند. این پیام وقتی برنامه کنترل‌گر useInput یا usePaste یا هدف فوکوس داشته باشد، فقط در کنسول مرورگر، از جمله در مسیرهای رندرشده در سمت سرور، نمایش داده می‌شود. آینه‌های درون‌صفحه‌ای و پیش‌نمایش ⁦VS Code⁩ آن را نشان نمی‌دهند. با focusHint: false در text.config.ts یا createConsoleRoot آن را غیرفعال کنید.
    • @textjs/react: هوک usePageFocus() برمی‌گرداند که آیا صفحه فوکوس دارد. برای اینکه خودتان تعیین کنید برنامه چه زمانی صفحه‌کلید را می‌خواهد، مقدار focusHint: false را تنظیم کنید و <FocusHint active={…}> را رندر کنید. فراخوانی useInput(handler, { ambient: true }) یک میان‌بر همیشه‌فعال را مشخص می‌کند که به‌تنهایی راهنما را نشان نمی‌دهد.

    تغییرات

    • @textjs/core: هنگام متحرک بودن اسپرایت <Pixels>، شیء ConsoleRenderer در Chromium هر 51 ms فریم‌های کلیدی را دسته‌بندی می‌کند، در Safari فاصلهٔ فریم‌ها را روی 33 ms تنظیم می‌کند و خروجی افزوده‌شده به انتها را در CssConsoleDriver در 4 MB پاک می‌کند (SPRITE_MAX_BYTES). اسپرایت‌های ایستا و برنامه‌های صرفاً متنی، زمان‌بندی موجود و حد پاک‌سازی 300 فریم را حفظ می‌کنند.
  6. v1.2.0

    افزوده‌ها

    • @textjs/core: تابع bindTextSink(element, onText) متن نهایی‌شده با IME یا کلید مرده را از textarea یا input مخفی می‌خواند، یک بار در هر نهایی‌سازی و هرگز در میانهٔ ترکیب. تابع engine.bindTextSink(element) یک textarea را که خودتان رندر می‌کنید به InputEngine متصل می‌کند. هر دو تابعی برمی‌گردانند که شنونده‌ها را حذف می‌کند.
    • @textjs/app: نقطهٔ پایانی POST /__textjs/input برای متن IME و کلید مرده، { type: "text", text } را می‌پذیرد. نوع InputMessage و تابع parseInputMessage در @textjs/app/frame-protocol آن را شامل می‌شوند.

    تغییرات

    • @textjs/app: میان‌افزار و کنترل‌گرهای مسیر، مسیر معیار را دریافت می‌کنند. مسیرهای /docs/ و /docs//intro به‌صورت /docs و /docs/intro می‌رسند، بنابراین میان‌افزاری که برای افزودن اسلش پایانی تغییرمسیر می‌دهد، اکنون بی‌پایان تغییرمسیر می‌دهد. آن تغییرمسیر را حذف کنید. بخش پویا نمی‌تواند اسلش کدگذاری‌شده داشته باشد: مسیر /files/a%2Fb کد 400 را برمی‌گرداند.
    • @textjs/app: با میان‌افزار، گزینهٔ --adapter cloudflare همهٔ درخواست‌ها، از جمله دارایی‌های هش‌شده را به worker می‌فرستد و با basePath درخواست‌های خارج از مسیر پایه را نیز می‌فرستد. هر درخواستی که worker را اجرا می‌کند یک فراخوانی Functions است و از سهمیهٔ درخواست Workers شما کم می‌کند. در طرح ⁦Workers Free⁩، پروژهٔ Pages را روی حالت بسته هنگام خطا تنظیم کنید (تنظیمات ← محیط اجرا ← باز / بسته هنگام خطا)، وگرنه پس از اتمام سهمیهٔ روزانه، Pages فایل‌های شما را بدون میان‌افزار ارائه می‌کند.

    رفع اشکال‌ها

    • ⁦IME⁩های چینی، ژاپنی و کره‌ای و کلیدهای مرده در کنسول‌های درون‌صفحه‌ای textjs.org کار می‌کنند. کنسول‌ها textarea را در میانهٔ ترکیب پاک می‌کردند، بنابراین برنامه حروف خام یا نویسهٔ اشتباه را دریافت می‌کرد.
    • کامپوننت <FocusPad> پس از کلیک فوکوس صفحه‌کلید را روی برنامه نگه می‌دارد. پیش‌تر فوکوس را بی‌درنگ از دست می‌داد، بنابراین IMEهای چینی، ژاپنی و کره‌ای نمی‌توانستند متن ترکیب کنند.
    • کلیدهای مرده‌ای که ترکیب نمی‌شوند (Windows و Linux بدون IME)، با فوکوس بودن textarea مخفی به برنامه می‌رسند. در ⁦US-International⁩، کلید ' و سپس e نویسهٔ é و کلید ' و سپس t متن 't را می‌دهد. شیء InputEngine رویداد keydown تکمیل‌کنندهٔ کلید مرده را مسدود می‌کرد، بنابراین مرورگر چیزی درج نمی‌کرد. اکنون DeadKeyTracker در @textjs/core اجازهٔ عبور آن keydown را می‌دهد و پیش‌نمایش ⁦VS Code⁩ نیز از آن استفاده می‌کند.
    • پیش‌نمایش ⁦VS Code⁩ متن IME و کلید مرده را که پیش‌تر حذف می‌کرد تحویل می‌دهد و دیگر کلیدهای مرده یا کلیدهای ترکیب IME را به برنامه نمی‌فرستد. با سرور text dev از @textjs/app نسخهٔ 1.1.0 یا قدیمی‌تر، متن را به‌صورت فشردن کلید یا چسباندن ارسال می‌کند.
    • @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 نیز ⁦Cascadia Mono⁩ را پیش از Consolas قرار می‌دهند.
    • @textjs/opencode: در Node روی Windows، پل نسخهٔ OpenCode نصب‌شده با npm i -g opencode-ai را پیدا می‌کند. Node نمی‌تواند واسط opencode.cmd متعلق به npm را با نام اجرا کند، بنابراین پل چنان رفتار می‌کرد که گویی OpenCode نصب نیست. اکنون PATH را با هر پسوند PATHEXT جست‌وجو می‌کند و واسط‌های .cmd را از طریق cmd.exe اجرا می‌کند. در Bun (bunx) از قبل کار می‌کرد.
    • دستور text build در Windows کار می‌کند. پیش‌تر برای همهٔ قالب‌ها با پیام Could not resolve entry module "virtual:textjs/api" یا بدون پیام خطا شکست می‌خورد.
    • دستور text build هنگام شکست پیش‌رندر پوسته‌های کنسول یا ساخت مسیرهای رندرشده در سمت سرور، خطا را چاپ می‌کند. پیش‌تر پس از سطر «ساخت ناموفق بود» در Vite، بدون ذکر دلیل با کد 1 خارج می‌شد.
    • دستور text dev در Windows هنگام ویرایش فایل، مسیرهای رندرشده در سمت سرور را دوباره رندر می‌کند و هنگام تغییر خروجی runtime صفحه، مرورگر را دوباره بارگذاری می‌کند.
    • دستور text dev در Windows دیگر middleware.ts را برای فایل‌های منبعی که Vite به‌صورت ماژول ارائه می‌کند، مانند /app/page.tsx، اجرا نمی‌کند، بنابراین تغییرمسیر احراز هویت دیگر کلاینت توسعه را خراب نمی‌کند.
    • دستورهای text run و text mcp وقتی مسیر پروژه نام کوتاه ⁦Windows 8.3⁩، مانند C:\Users\RUNNER~1، دارد کار می‌کنند. پیش‌تر پیام «خطای برنامه» را نشان می‌دادند زیرا CLI و برنامه، @textjs/app را دو بار بارگذاری می‌کردند.
    • خروجی dist/ ساخته‌شده در Windows صفحه‌های پیش‌رندرشدهٔ خود را در Linux و macOS ارائه می‌کند. فهرست مسیرهای زنده، مسیرهای خود را با بک‌اسلش ذخیره می‌کرد.
    • دستور text build وقتی گزینهٔ vite در text.config.ts مقدار build.rollupOptions.input را تنظیم می‌کند کار می‌کند. ورودی، نقطه‌های ورود بسته‌های API، مسیر رندرشده در سمت سرور و آداپتور را جایگزین می‌کرد و ساخت شکست می‌خورد.
    • دستور text dev وقتی در ثانیه‌های نخست پس از بارگذاری صفحه آن را متوقف می‌کنید خارج می‌شود و server.close() تکمیل می‌شود. بستن Vite هنگام بهینه‌سازی وابستگی‌های تازه‌کشف‌شده هرگز تمام نمی‌شد (⁦vitejs/vite#22934⁩).

    امنیت

    • بستهٔ @textjs/app نسخهٔ 1.1.0 و قدیمی‌تر به درخواست اجازه می‌داد با نوشتن مسیر محافظت‌شده به‌شکلی دیگر، مانند /ad%6din، /api//admin یا /admin%2Fx، از middleware.ts عبور کند. میان‌افزار مسیر را همان‌طور که ارسال شده بود تطبیق می‌داد، درحالی‌که صفحه‌ها، کنترل‌گرهای مسیر و فایل‌های ایستا پس از رمزگشایی آن جست‌وجو می‌شدند (برای کنترل‌گرهای مسیر دو بار). این مشکل بر text dev، text start و ساخت‌های --adapter bun، vercel و cloudflare اثر داشت. ساخت‌های ایستا نمی‌توانند از میان‌افزار استفاده کنند و تحت تأثیر نیستند. به 1.2.0 ارتقا دهید، سپس دوباره بسازید و مستقر کنید: .vercel/output برای Vercel، دایرکتوری dist/ برای ⁦Cloudflare Pages⁩ و کل dist/ برای Bun (سرور را دوباره راه‌اندازی کنید). استقرارهای قدیمی را که هنوز از نشانی‌های خود در دسترس‌اند حذف یا محافظت کنید.
    • اکنون هر میزبان برای هر درخواست یک نام مسیر معیار تعیین می‌کند و آن را برای تطبیق‌دهنده، 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* که میان‌افزار هرگز بررسی نکرده بود نمی‌رسد. هر مسیری که ممکن است معیار نباشد، از جمله نویسه‌های خام مانند {، از ⁦edge middleware⁩ می‌گذرد که اکنون همراه هر ساخت Vercel ارائه می‌شود و درخواست را به مسیر معیار آن بازنویسی می‌کند.
    • --adapter cloudflare: فایل‌های ایستا با مسیر کدگذاری‌شده جست‌وجو می‌شوند، بنابراین /x/%252e%252e/admin/report.txt دیگر /admin/report.txt را ارائه نمی‌کند. با basePath، فایل‌های خارج از آن دیگر بدون worker ارائه نمی‌شوند.
    • دستور text dev فایل‌های public/ را زیر /public/… یا /@fs/…، منابع مختص سرور مانند middleware.ts و text.config.ts را با بزرگی و کوچکی حروف متفاوت، زیر مسیر کدگذاری‌شدهٔ /@fs/، به‌صورت درخواست ماژول بدون پسوند (/text.config?import) یا از طریق بازنویسی پیکربندی و کنترل‌گرهای مسیر را خارج از basePath ارائه نمی‌کند.
  7. v1.1.0

    افزوده‌ها

    • ⁦Text.js⁩ در کنسول‌های Firefox و Safari رندر می‌شود. شیء CssConsoleDriver مرورگر را با بررسی قابلیت‌های CSS تشخیص می‌دهد. هرجا spanهای %c درون‌خطی می‌مانند، ارتفاع سطر 14 پیکسلی بدون حاشیه می‌نویسد، شکستن خودکار سطر را غیرفعال می‌کند و از پرده‌ای با line-height: 100vh استفاده می‌کند.
    • اندازه‌گذاری واکنش‌گرا برای ستون پیوند منبع Firefox جا می‌گذارد. Safari قلم Menlo را در ابتدای پشتهٔ قلم قرار می‌دهد: صفحه‌های آن نمی‌توانند از ⁦SF Mono⁩ نصب‌شده به‌دست کاربر استفاده کنند، درحالی‌که ⁦Web Inspector⁩ ممکن است با آن رسم کند.
    • برای انتخاب کنسول، مقدار browser: "chromium" | "firefox" | "safari" را به createConsoleRoot، ConsoleRenderer یا CssConsoleDriver بدهید.
    • پوسته‌های پیش‌رندرشده CSS هر دو نوع کنسول را همراه دارند.
    • کامپوننت <FocusPad> میان‌بر کنسول مرورگر بازدیدکننده را نشان می‌دهد: ⁦⌘⌥K⁩ یا ⁦Ctrl+Shift+K⁩ در Firefox و ⁦⌘⌥C⁩ در Safari همراه با یادداشتی برای فعال کردن «نمایش قابلیت‌ها برای توسعه‌دهندگان وب».
    • کامپوننت پیش‌رندرشدهٔ <FocusPad> میان‌بر همهٔ مرورگرها را رندر می‌کند. پیش از نخستین رسم، data-browser (firefox یا safari) و data-os (mac) را روی <html> تنظیم کنید تا فقط میان‌بر بازدیدکننده نمایش داده شود؛ بدون آن‌ها تا زمان آب‌رسانی، میان‌بر Chrome در Windows و Linux را نشان می‌دهد.

    رفع اشکال‌ها

    • میان‌برهای ⁦⌘⌥K⁩ و ⁦Ctrl+Shift+K⁩ (میان‌بر کنسول Firefox) به‌جای رسیدن به برنامه، به مرورگر منتقل می‌شوند.
    • اندازه‌گذاری واکنش‌گرا هنگام بسته بودن DevTools ارتفاع نوارابزارهای مرورگر کوتاه‌تر از 60 پیکسل (Safari و Firefox) را یاد می‌گیرد، بنابراین کنسول متصل به پایین همهٔ سطرهایی را که در آن جا می‌گیرند دریافت می‌کند. کامپوننت <FocusPad> از ارتفاع آموخته‌شده برای تشخیص متصل بودن DevTools استفاده می‌کند.
    • کامپوننت <FocusPad> میان‌برهای Windows و Linux را در حالت کلیک خود به‌صورت Ctrl+Shift+J می‌نویسد.

    امنیت

    • @textjs/opencode: پل هنگام شروع یک کد جفت‌سازی چاپ می‌کند و ⁦textjs.org/opencode⁩ در نخستین اتصال آن را می‌خواهد. تا زمانی که صفحه کد را ارسال نکند، پل با 428 پاسخ می‌دهد و چیزی به OpenCode نمی‌فرستد، حتی برای مبدأهای مجاز. هر کد برای یک اجرای پل معتبر است، توکن برگشتی فقط از مبدأ جفت‌شده کار می‌کند و ده کد اشتباه، جفت‌سازی را تا راه‌اندازی دوبارهٔ پل قفل می‌کند.
    • @textjs/opencode: استقرارهای پیش‌نمایش ⁦Cloudflare Pages⁩ از textjs.org دیگر به‌طور پیش‌فرض مجاز نیستند. برای استفاده از یکی، گزینهٔ --allow-origin را بدهید.
    • ⁦textjs.org/opencode⁩ پل‌های @textjs/opencode نسخهٔ ⁦1.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 متصل می‌شود.
  8. v1.0.4

    افزوده‌ها

    • ⁦OpenCode Lite⁩: تفاوت‌های هر فایل را بازبینی کنید، تاریخچهٔ پرامپت را مرور کنید، میان‌برهای پیشوندی را پیکربندی کنید و حساب‌های ارائه‌دهندگان و سرورهای MCP را مدیریت کنید. محیط آزمایشی شامل پنجرهٔ ترمینال اسکریپت‌شده است.
    • ⁦OpenCode Lite⁩: برای جست‌وجوی فرمان‌ها / یا برای پیوست کردن فایل پروژه @ را تایپ کنید. کلید Tab در منوی فایل یک دایرکتوری را باز می‌کند. نشست‌های متصل پروژهٔ سرور را جست‌وجو می‌کنند؛ محیط آزمایشی مخزن نمونهٔ خود را جست‌وجو می‌کند.
    • ⁦textjs.org/coffee⁩: دموی terminal.shop مانند برنامهٔ SSH از اندازهٔ کنسول پیروی می‌کند، با چیدمان‌های کوچک، متوسط و بزرگ و پیام «ترمینال شما بیش از حد کوچک است» در اندازه‌های کمتر از ⁦20 × 10⁩. حساب کاربری روش‌های پرداخت، نمایه‌ای با نام قابل ویرایش و تغییر برنامهٔ هفتگی اشتراک‌ها را اضافه می‌کند. در حالت خروج از حساب، سبد خرید و پرسش‌های متداول، درباره و اطلاعات اشکال‌زدایی حساب بدون ورود باز می‌شوند.
  9. v1.0.3

    کارایی

    • @textjs/react: کامپوننت‌های Box و Text به‌جای کپی کردن آبجکت‌های prop هنگام نصب و به‌روزرسانی، propهای صحنه را که از پیش پالایش شده‌اند به تطبیق‌دهنده می‌دهند.
    • @textjs/core: متد SceneNode.getTextModel() از پیمایش‌های درخت درون‌خطی روی برگ‌های تک‌رشته‌ای <Text> صرف‌نظر می‌کند و از بافرهای صفرشده و ذخیره‌شدهٔ Uint16Array با نام runOf دوباره استفاده می‌کند. CssConsoleDriver سلول‌های متوالی BMP با سبک یکسان را در حلقه‌ای داخلی بررسی می‌کند و ConsoleRenderer در فریم‌های بدون تغییر، از اجرای countYogaNodes() صرف‌نظر می‌کند.
    • textjs.org: مسیرها و زبانه‌های همراه کنسول به قطعه‌های JS و CSS جداگانه برای هر مسیر تقسیم می‌شوند. عکس‌های فروشگاه از نسخه‌های اصلی photos/final دوباره کدگذاری می‌شوند و عکس‌های ثانویهٔ محصول هنگام قرار گرفتن نشانگر روی آن‌ها یا تغییر اسلاید بارگذاری می‌شوند.

    رفع اشکال‌ها

    • کامپوننت <ViewportControl> به‌جای 20ch از minWidth پیکسلی استفاده می‌کند و قلم‌های جایگزین با معیارهای همسان را در کنار <FocusPad> فهرست می‌کند تا انتخابگر اندازه هنگام بارگذاری Geist Mono عرض خود را حفظ کند.
  10. v1.0.2

    افزوده‌ها

    • @textjs/opencode: پل ⁦textjs.org/opencode⁩ به‌صورت بسته‌ای مستقل و بدون وابستگی. برای شروع آن بدون نصب Vite، React و SDK مربوط به MCP، دستور bunx @textjs/opencode proxy (یا npx) را اجرا کنید. دستور text proxy همچنان کار می‌کند و همان پل را اجرا می‌کند.

    تغییرات

    • بستهٔ فریم‌ورک و CLI اکنون @textjs/app است و از @textjs/next تغییر نام یافته تا نام آن ادغام رسمی با Next.js را القا نکند. بستهٔ @textjs/next به نفع @textjs/app منسوخ شده و نسخهٔ تازه‌ای دریافت نمی‌کند. برای جابه‌جایی، دستور bun remove @textjs/next && bun add @textjs/app را اجرا کنید و در importها، از جمله زیرمسیرهایی مانند @textjs/app/link، نام @textjs/next را با @textjs/app جایگزین کنید. CLI همچنان text است و قالب‌های ⁦create-text-app⁩ به @textjs/app وابسته‌اند.
    • نشان [▼] و بازرس داخل کنسول، لایهٔ توسعه نام دارند و عنوان بازرس ▼ Dev Overlay · Turbolog است. ⁦Text.js DevTools⁩ فقط نام افزونهٔ Chrome است. کامپوننت <TextDevOverlay> و propهای آن تغییر نکرده‌اند.
    • کنترل‌گرهای مسیری که dynamic = "error" را صادر می‌کنند با TX031 شکست می‌خورند. Text.js آن را مانند "force-static" در نظر می‌گرفت، بدون بررسی اینکه کنترل‌گر درخواست را می‌خواند یا نه، که معنای این مقدار در Next.js است. از "force-static" استفاده کنید.

    رفع اشکال‌ها

    • دستور text start مانند text dev به Host مسدودشده با TX028 پاسخ می‌دهد. هر سرور نام تنظیمی را که می‌خواند بیان می‌کند: vite.server.allowedHosts برای text dev و server.allowedHosts برای text start.
    • textjs.org: فصل انتشار در آموزش دیگر از شما نمی‌خواهد بازنویسی vercel.json اضافه کنید. در Vercel و ⁦Cloudflare Pages⁩، دستور text build خودش جایگزین index.html را می‌نویسد. نمونهٔ بازنویسی اکنون از _redirects در Netlify استفاده می‌کند.
    • eslint-plugin-textjs: قانون route-handler-exports خروجی‌های dynamic و revalidate را در route.ts مجاز می‌داند و valid-route-module مقدارهای dynamic را در آنجا بررسی می‌کند.
  11. v1.0.1

    افزوده‌ها

    • ⁦textjs.org⁩: ویدیوی در حال پخشِ فصل آموزش، وقتی با پیمایش از آن عبور می‌کنید، به پخش‌کننده‌ای کوچک در گوشه منتقل می‌شود. دکمهٔ «زیرنویس» زیر هر ویدیو، زیرنویس را روشن یا خاموش می‌کند و انتخاب را به خاطر می‌سپارد.
    • <TextDevOverlay> ویژگی‌های pill، shortcut و shell را می‌پذیرد تا برنامه‌های بدون ⁦App Router⁩ بتوانند بازرس را با کلیدها و کنترل‌های پوستهٔ خود نصب کنند.
    • <FocusPad> یک banner می‌پذیرد که در ردیف اول پیام (برای مثال، نشان نوشتاری برنامه) و در دستگاه‌های لمسی بالای اعلان نمایش داده می‌شود.

    تغییرات

    • ⁦textjs.org⁩: انتخابگر Playground داشبورد، پخش جریانی، مار، OpenCode و قهوه (terminal.shop) را فهرست می‌کند. هر دمو نشانی خودش را دارد: OpenCode در /opencode و terminal.shop در /coffee است و نشان نوشتاری آن‌ها در ابتدای پیام قرار دارد. شمارنده و فرم از Playground خارج شدند؛ مستندات همچنان هر دو را به‌صورت نمونهٔ زنده اجرا می‌کند.
    • کامپوننت <FocusPad> چیدمان تازه‌ای دارد. هر حالت یک نوار پیشرفت سه‌بخشی، یک عنوان، یک عنصر بزرگ و یک سطر متن نشان می‌دهد. پیش از باز شدن کنسول، عنصر بزرگ میان‌بر DevTools است. هنگام انتظار برای کلیک، یک نشانگر است. پس از فعال شدن، مقدار hints برنامه به‌صورت کلیدهایی است که با دریافت کلید روشن می‌شوند و کلیدهای بدون راهنما در زیر بازتاب می‌یابند. برچسب‌های مراحل، نشان جداگانهٔ «زنده» و سطر «کنسول را تماشا کنید.» حذف شده‌اند. سطرها هنگام تغییر حالت به‌تدریج ظاهر می‌شوند، هرگز در نخستین رسم، و حرکت با prefers-reduced-motion خاموش است. متن ثانویه در هر دو ظاهر تضاد ⁦WCAG AA⁩ را دارد و انتخابگر اندازهٔ کنسول هنگام رسیدن با صفحه‌کلید حلقهٔ فوکوس نشان می‌دهد.
    • textjs.org: بخش Playground از چیدمان تازهٔ <FocusPad> استفاده می‌کند. دموی فعلی انتخابگر سطحی مانند کلیدها دارد، گوشه‌ها و اندازهٔ متن فیلد فرمان OpenCode با فیلد URL هماهنگ است، یادداشت terminal.shop به‌جای سه سطر دو سطر می‌گیرد، «مشاهدهٔ منبع» روی خط پایهٔ کنترل اندازه قرار دارد و متن کم‌رنگ پد تضاد AA را دارد.

    رفع اشکال‌ها

    • دستور text dev مسیرهای proxy را در هر درخواست از طریق پراکسی ارائه می‌کند. تابع fetch() هدر Accept: */* را می‌فرستد، بنابراین سرور توسعه ابتدا با HTML برنامه به آن‌ها پاسخ می‌داد و قالب opencode در نخستین اجرا با پیام «توکن غیرمنتظرهٔ '<'» شکست می‌خورد.
    • دستور text dev دیگر هنگام خواندن فایل مختص سرور در اسکن وابستگی Vite، نسخهٔ دوم React را بارگذاری نمی‌کند. اسکن، بررسی import مختص سرور را فعال می‌کرد که رد پشته و سپس «فراخوانی نامعتبر هوک» را در کنسول چاپ می‌کرد و ⁦Fast Refresh⁩ را خراب می‌کرد.
    • دستور text dev نشانی صفحه‌های دارای رشتهٔ پرس‌وجو، مانند /?demo، را مدیریت می‌کند. Vite آن‌ها را پوشهٔ پروژه در نظر می‌گرفت و کل دیسک را زیر نظر می‌گرفت، بنابراین در Linux صفحه هرگز بارگذاری نمی‌شد.
    • ⁦create-text-app⁩: نشان توسعه دیگر نخستین راهنمای کلید را در صفحهٔ نخست هیچ قالبی نمی‌پوشاند، نام پیش‌فرض پروژه برای تطبیق با مستندات my-app است، قالب‌ها از پیکربندی پیشنهادی eslint-plugin-textjs عبور می‌کنند و README داشبورد ساخت --adapter static را توضیح می‌دهد.
    • کامپوننت‌های <FocusPad> و <ViewportControl> حاشیه‌ها را فقط با ویژگی‌های تفصیلی تنظیم می‌کنند. React در محیط توسعه هر بار که راهنمای کلید چشمک می‌زد هشدار «به‌روزرسانی ویژگی سبک هنگام رندر مجدد (border)» را نشان می‌داد.
    • متنی که آخرین مورد یک سطر است اکنون هنگام کوتاه‌تر شدن جای خود را حفظ می‌کند. پس از <Spacer>، در جایی می‌ماند که طولانی‌ترین متن آن را قرار داده بود و عناصر هم‌سطحی که برای جا شدن در سطر سرریز کوچک شده بودند، کوچک می‌ماندند.
    • کامپوننت <FocusPad> هنگام تغییر action یا hints، مراحل، زیرعنوان و سطرهای کلید خود را جایگزین می‌کند تا تعویض دمو در یک پد به‌عنوان جابه‌جایی چیدمان گزارش نشود.
    • بستهٔ @textjs/react/testing هنگام import شدن Yoga را بارگذاری می‌کند تا آزمون بتواند پیش از نخستین render()، تابع fetch را با نمونهٔ آزمایشی جایگزین کند.
  12. v1.0.0

    نخستین نسخهٔ پایدار. ▼ Text.js 1.0.0 (Turbolog).

    تغییرات

    • تغییر ناسازگار: بستهٔ فریم‌ورک و CLI اکنون @textjs/next است (نام textjs در npm گرفته شده است). importها را از textjs به @textjs/next به‌روزرسانی کنید.
    • پل OpenCode دستور bunx @textjs/app proxy است و از هر دایرکتوری اجرا می‌شود.
    • کنسول به‌طور پیش‌فرض با پنل متصل DevTools هماهنگ می‌شود (اتصال پایین، چپ یا راست، بزرگ‌نمایی صفحه، چندخطی شدن نوارابزار). DevTools جداشده به 120×36 برمی‌گردد. پدها کنترل اندازه دریافت کردند.

    افزوده‌ها

    • هوک useKeymap با صفحهٔ راهنمای خودکار ?، راهنمای کلیدها و پالت فرمان Ctrl+K.
    • کامپوننت‌های داده: 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⁩) را پیاده‌سازی می‌کند و از همهٔ 770,241 مورد BidiTest.txt و 91,707 مورد BidiCharacterTest.txt عبور می‌کند. حروف عربی شکل‌دهی می‌شوند و <Text dir> یک span را ایزوله می‌کند.
    • کدهای خطای پایدار TX###. خطاهای فریم‌ورک یک کد و پیوندی به https://textjs.org/errors/<code> دارند.
    • بستهٔ @textjs/react/testing برای رندر کامپوننت‌ها به متن در آزمون‌ها.
    • بستهٔ @textjs/react/terminal و دستور text run که برنامهٔ ⁦App Router⁩ را در ترمینال واقعی رندر می‌کند.
    • دستور text mcp که برنامه را از طریق ⁦Model Context Protocol⁩ ارائه می‌کند تا عامل‌های کدنویسی بتوانند بدون مرورگر در آن جابه‌جا شوند، کلید فشار دهند و فریم‌ها را بخوانند.
    • افزونهٔ ⁦Text.js DevTools⁩، پنلی کنار کنسول با درخت کامپوننت‌ها، بازرس فریم و خط زمان.
    • بستهٔ eslint-plugin-textjs و افزونهٔ ⁦VS Code⁩ با پیش‌نمایش‌های زنده.
    • apps/terminal-shop: فروشگاه terminal.shop در کنسول، متصل به API واقعی (به‌طور پیش‌فرض محیط آزمایشی توسعه، محیط عملیاتی با قفل دوگانه).
    • textjs.org: آموزش، دوره‌ای 10 فصلی که در کنسول اجرا می‌شود. پیش‌رندر هنگام ساخت با آب‌رسانی، قلم‌های خودمیزبان با معیارهای همسان، مسیرهای .html بدون اسلش و صفحه‌های تازهٔ مستندات با پیش‌نمایش زنده.

    کارایی

    • قفل فاز محدودسازی DevTools پس از پاک‌سازی شکسته شد. پس از فریمی که پاک‌سازی می‌کند، رندرکننده یک بار 110 ms منتظر می‌ماند تا فریم‌های بعدی در مسیر فوری DevTools قرار بگیرند. تأخیر نمایش ⁦p50⁩ از 63 ms به 10 ms رسید.
    • رسم جزئی نوار آسیب: فقط نوارهای سطری که تغییر به آن‌ها رسیده دوباره رسم می‌شوند.
    • هش‌های ذخیره‌شدهٔ هر سطر، شناسه‌های سبک عددصحیح و فریم‌های بیکار بدون تخصیص حافظه.
    • هیچ زمان‌سنج بیکاری هنگام مخفی یا بدون فوکوس بودن صفحه.

    رفع اشکال‌ها

    • دیگر در محل شکست ردیف‌ها spanهای خالی ناخواسته در لایهٔ ترسیم وجود ندارند و پرده نیز دوبرابر نمی‌شود.
    • پرده در خطی جداگانه قرار می‌گیرد، بنابراین پیوند منبع DevTools یعنی (VM12:1) هرگز باعث شکستن ردیف 0 نمی‌شود.
    • نشانگر چرخان پیش‌فرض دقیقاً با سلول‌ها منطبق است (Menlo نویسه‌های بریل ندارد). گونهٔ braille اختیاری است.
    • دستور text build روی Node دیگر بیلدهای توسعهٔ React را در بسته نمی‌گنجاند.
    • textjs.org: جابه‌جایی تجمعی چیدمان در هر مسیر 0 است. Playground و OpenCode از چیدمان پد مشترکی استفاده می‌کنند.
    • textjs.org: نوارهای کناری مستندات و آموزش در پایین صفحه‌های بلند ثابت می‌مانند.
    • textjs.org: زبانه‌های فایل، بلوک‌های کد و جدول‌های متن فقط به‌صورت افقی پیمایش می‌شوند، بنابراین Safari در iOS هرگز حرکت‌های عمودی انگشت برای پیمایش صفحه را نمی‌گیرد.
    • textjs.org: ویژگی scrollbar-gutter: stable فقط برای دستگاه‌های دارای ماوس اعمال می‌شود. در Safari روی iOS، این ویژگی باعث پرش در اولین پیمایش می‌شد.
    • textjs.org: لنگرگذاری پیمایش خاموش است. در Safari روی iOS، بخش اصلی ابتدای صفحه را زیر سربرگ چسبان ثابت می‌کرد.
  13. v0.4.0

    فریم‌های بدون چشمک و رندر سمت سرور.

    تغییرات

    • فریم‌ها به‌جای اجرای console.clear() + console.log() برای هر فریم، به انتها افزوده می‌شوند. DevTools پاک‌سازی را همگام اعمال می‌کند، اما ترسیم پیام‌های جدید را با فاصلهٔ 50 ms محدود می‌کند؛ بنابراین پاک‌سازی در ⁦70.6%⁩ از ترسیم‌های DevTools با نرخ 15 فریم‌برثانیه و ⁦81.1%⁩ با نرخ 60 فریم‌برثانیه، کنسول را خالی می‌گذاشت. یک span پرده‌ای با عرض صفر در ابتدا، فریم‌های قبلی را پنهان می‌کند. کنسول فقط در اولین فریم، پس از invalidate()، هنگام بیکاری پس از انباشته شدن 100 فریم، یا در 300 فریم پاک می‌شود.
    • فریم‌های خروجی با فاصلهٔ حداقل 66 ms زمان‌بندی می‌شوند (حدود 15 فریم‌برثانیه). فریم‌های سریع‌تر زمان‌سنج محدودسازی DevTools را از نو شروع می‌کنند و حذف می‌شوند: با نرخ 60 فریم‌برثانیه، DevTools از 295 فریم خروجی، 67 فریم را ترسیم کرد.
    • Playground و OpenCode پدهای فوکوس تمام‌صفحه هستند.

    کارایی

    • ⁦CSS⁩ مربوط به span فقط از ویژگی‌های تفکیک‌شده استفاده می‌کند و تعداد ویژگی‌هایی را که DevTools روی هر خط کپی می‌کند از حدود 33 به حدود 7 کاهش می‌دهد. رنگ‌های هگز و دنباله‌های خالی که کلیدشان فقط پس‌زمینه است.
    • تجزیهٔ افزایشی Markdown و ردیف‌های حافظه‌گذاری‌شدهٔ Markdown، Code و Diff.
    • پردازش تک‌مرحله‌ای propهای میزبان، به‌روزرسانی پراکندهٔ propها و حذف چیدمان مجدد Yoga وقتی اندازهٔ متن نمی‌تواند تغییر کند.
    • زمان یک فریم جریانی از 0.79 ms به 0.14 ms و یک تیک نشانگر چرخان از 0.90 ms به 0.056 ms رسید. خروجی بیت‌به‌بیت یکسان است.

    افزوده‌ها

    • رندر سمت سرور. صفحه‌ای که runtime = "server" را صادر می‌کند، همراه با کامپوننت‌های async function روی سرور رندر می‌شود و تغییرات سلول‌ها را در سطح ردیف، از طریق رویدادهای ارسالی سرور به یک پخش‌کنندهٔ فریم با حجم حدود 19 kB با فشرده‌سازی gzip می‌فرستد.
    • پیش‌رندر جزئی. دستور text build اولین فریم هر مسیر ایستا را در HTML آن قرار می‌دهد تا کنسول پیش از بارگیری هر ماژولی ترسیم شود.
    • middleware.ts، پیکربندی بخش مسیر (dynamic، revalidate) و textjs/cache (unstable_cache، revalidateTag، revalidatePath).
    • text build --adapter static|bun|vercel|cloudflare.
    • bench/devtools: یک ابزار آزمون که فرانت‌اند واقعی DevTools را هدایت می‌کند و ترسیم‌های خالی، فریم‌های حذف‌شده، تأخیر نمایش و مصرف CPU در DevTools را اندازه می‌گیرد.

    رفع اشکال‌ها

    • ⁦DevTools⁩ دیگر متن‌های path:line، //host:port و data: را به پیوند تبدیل نمی‌کند.
    • پل OpenCode سرویس پس‌زمینهٔ مدیریت‌شده را پیدا می‌کند (درگاه موقت، احراز هویت پایه)، هنگام نوشتن هدر CSRF را می‌فرستد و خطاها را در یک خط گزارش می‌کند.
  14. v0.3.0

    تغییرات

    • ورودی گسسته (فشردن کلید، چسباندن) به‌جای انتظار برای فریم بعدی پویانمایی، به‌صورت همگام در همان وظیفه رندر می‌شود.
    • یک رابط متنی ساده‌شدهٔ OpenCode که با نسخهٔ واقعی مطابقت دارد.
    • بازبینی کامل textjs.org برای موبایل و نمایش واکنش‌گرا.

    افزوده‌ها

    • @textjs/font: تجزیه‌گر و رندرکنندهٔ فونت FIGlet با 17 فونت همراه، برای <FigletText> و <AsciiFont>. خروجی با 273 مرجع ثبت‌شده از فایل باینری figlet نسخهٔ 2.2.5 مطابقت دارد.
    • text proxy: یک پل محلی CORS برای ارتباط textjs.org با سرور OpenCode شما.
  15. v0.2.0

    افزوده‌ها

    • apps/opencode-console: یک کلاینت متصل OpenCode که در console.log رندر می‌شود و وقتی سروری در حال اجرا نیست، نسخهٔ نمایشی را جایگزین می‌کند.
    • یک قالب opencode برای create-text-app.
    • textjs.org: صفحهٔ فرود جدید، همراه زندهٔ کنسول، Playground، صفحهٔ OpenCode و مستندات.
    • گردش کار استقرار ⁦GitHub Pages⁩ با تولید مسیرهای ایستا.
  16. v0.1.0

    نخستین نقطهٔ عطف.

    افزوده‌ها

    • @textjs/core: ساختار CellBuffer روی آرایه‌های نوع‌دار تخت، چیدمان ⁦Yoga WASM⁩، اندازه‌گیری متن با Intl.Segmenter و درایور کدگذاری طول دنبالهٔ %c. یک فراخوانی console.log برای هر فریم تغییریافته و بدون فراخوانی هنگام بیکاری.
    • @textjs/react: یک تطبیق‌دهندهٔ ⁦React 19⁩، کامپوننت‌های PascalCase (Box، Text، ScrollBox، Input، Textarea، Select، Tabs، Code، Markdown، Diff، Modal، Spinner و موارد دیگر)، ابزارهای className به سبک Tailwind در سطح سلول، پوسته‌ها و کامپوننت DOM با نام FocusPad.
    • textjs: قابلیت ⁦App Router⁩ مبتنی بر سیستم فایل (layout، page، loading، error، not-found، بخش‌های پویا، کنترل‌گرهای مسیر)، text dev، text build، text start و بازرس [▼] درون کنسول.
    • create-text-app با قالب‌های starter و dashboard.