الجديد في 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⁩ يزيد بمقدار 92 بكسل على شاشة بعرض 390 بكسل.
  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 كلها، لذا تحمّل صفحات التوثيق الإنجليزية JavaScript أقل بمقدار ⁦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. لا توجد موسيقى.

    التغييرات

    • @textjs/react، @textjs/app: يظهر تلميح التركيز («انقر على الصفحة لاستخدام لوحة المفاتيح») كشريط كهرماني بنص أسود عريض في كل سمة. كان يستخدم ألوان السمة معكوسة. يومض في كل ظهور 4 مرات خلال نحو 6 ثوانٍ، ثم يبقى كهرمانيًا. لا يومض عند تفعيل تقليل الحركة. تسجّل كل دورة وميض ما يصل إلى 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 / doom⁩» بدلًا من «⁦Text.js / playground / doom⁩».
    • ⁦textjs.org/doom⁩: لم تعد النافذة الضيقة تترك الرمز «·» زائدًا بعد «عرض المصدر».
    • textjs.org: في النافذة الضيقة، يتلاشى منتقي العروض التوضيحية في Playground عند الحافة التي توجد بعدها عروض أخرى للتمرير إليها، بدلًا من قطع العرض الأخير في منتصف كلمة.
    • يعمل ⁦textjs.org/doom⁩ بمعدل Doom البالغ 35 نبضة في الثانية. كان يعمل داخل المستوى بسرعة مضاعفة ⁦3.8×⁩ على شاشة بتردد 60 Hz (131 نبضة في الثانية) و⁦5.5×⁩ عند 120 Hz (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 على الإطار الأول للصفحة كنص ANSI بألوان حقيقية بدلًا من صفحة HTML، عند استخدام text dev و text start ومحوّلات bun و vercel و cloudflare. يجري 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⁩ للصور. يخالف هذا عمدًا وعد سياسة الدعم بأن تبدو الإطارات متطابقة بين الإصدارات الفرعية. مرّر renderMode="halfblock" للاحتفاظ بأنصاف كتل 1.3. لا يزال Safari والطرفيات (بما فيها text run) ومخرجات ANSI والنص العادي والصفحات المعروضة على الخادم (runtime = "server") ترسم أنصاف الكتل.
    • @textjs/app: تحصل السكربتات وفحوص وقت التشغيل التي تجلب الصفحات باستخدام curl أو Wget أو HTTPie أو xh الآن على نص ANSI. لمواصلة الحصول على HTML، أرسل Accept: text/html، أو اضبط ansi: false في text.config.ts.
    • @textjs/app: لم تعد مكوّنات الخادم غير المتزامنة تعمل أثناء العرض المسبق لهيكل الصفحة بواسطة text build. تعرض بديل <Suspense> كما في السابق، دون بدء طلبات بياناتها وقت البناء.
    • @textjs/app: صغر مشغّل الإطارات للصفحات المعروضة على الخادم بمقدار 3 KB، ليصبح 22.4 KB بضغط gzip بدلًا من 25.4 KB للمثال examples/dashboard. لم يعد يتضمن أساليب الرسم في CellBuffer أو حدود الصناديق أو اقتطاع النص.

    الإصلاحات

    • @textjs/core: تحافظ المخططات ومؤشرات الانتظار على شبكتها في ⁦Windows 10⁩. خط وحدة التحكم فيه هو Consolas، الذي لا يحتوي على كتل الأثمان ▁▂▃▅▆▇ أو الأرباع أو برايل أو ▶ أو ✓، وكانت أشكالها البديلة تدفع الصفوف خارج الحافة اليمنى للإطار. يقيس CssConsoleDriver الآن، مرة واحدة، أيًا من هذه الأشكال يرسمه خط وحدة التحكم بانحراف يتجاوز خُمس خلية، ويرسمه بأقرب شكل متاح في Consolas: _ ▄ ▌ █ للأثمان، وأنصاف كتل للأرباع وبرايل، و ► ◄ √ × للأسهم وعلامات الصح والخطأ. ترسم الخطوط الملائمة لها، مثل ⁦Cascadia Mono⁩ على ⁦Windows 11⁩ و Menlo على macOS، الأشكال الأصلية. يعطّل measureText: false هذا السلوك.
    • @textjs/core: لم تعد تظهر خطوط عمودية دقيقة بعرض 1 px بين الخلفيات المتجاورة في DevTools في Chrome و Edge، مثل المواضع بجوار «الحساب» و«الكمية» على ⁦textjs.org/coffee⁩. يحاذي Chromium كل span من نوع %c مع بكسلات الجهاز على حدة، وكان قد يترك البكسل عند التقاء عنصري span خارج كليهما. يمدّ CssConsoleDriver الآن خلفية span بمقدار 1 px تحت الجار المعتم على اليمين (padding-right:1px;margin-right:-1px). لا تتغير إطارات Firefox و Safari.
    • @textjs/core: تتبع رسوم <Image> في Chrome و Edge قاعدة 1 px نفسها التي يتبعها النص. لم يعد النص على يسار رسم شفاف يرسم شريطًا بعرض 1 px من خلفيته فوق الحافة اليسرى للرسم، ويلتصق الرسم بالنص المعتم على يمينه، بما فيه النص المعكوس. يصل الرسم المنفرد في صفوفه الآن إلى الحافة اليمنى للإطار، مثل صفوف النص فوقه وتحته.
    • @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 الإطارات الرئيسية كل 51 ms في Chromium، ويضبط تتابع الإطارات إلى 33 ms في Safari، ويمسح المخرجات الملحقة في CssConsoleDriver عند 4 MB (SPRITE_MAX_BYTES). تحتفظ الرسوم الثابتة والتطبيقات النصية فقط بالتتابع الحالي وحد المسح البالغ 300 إطار.
  6. v1.2.0

    الإضافات

    • @textjs/core: يقرأ bindTextSink(element, onText) النص المعتمد بواسطة محرر أسلوب إدخال IME أو مفتاح ميت من مساحة نص أو حقل إدخال مخفي، مرة واحدة لكل اعتماد وليس أثناء التكوين. يربط engine.bindTextSink(element) مساحة نص تعرضها بنفسك مع InputEngine. يعيد كلاهما دالة تزيل مستمعي الأحداث.
    • @textjs/app: يقبل POST /__textjs/input الرسالة { type: "text", text } لنص IME والمفاتيح الميتة. يتضمنها InputMessage و parseInputMessage في @textjs/app/frame-protocol.

    التغييرات

    • @textjs/app: تحصل middleware ومعالجات المسارات على المسار الموحّد. يصل /docs/ و /docs//intro بصيغتي /docs و /docs/intro، لذا تدخل middleware التي تعيد التوجيه لإضافة شرطة مائلة ختامية الآن في حلقة إعادة توجيه لا تنتهي. أزل إعادة التوجيه تلك. لا يمكن أن يحتوي مقطع ديناميكي على شرطة مائلة مرمّزة: يعيد /files/a%2Fb الرمز 400.
    • @textjs/app: مع middleware، يرسل --adapter cloudflare كل طلب إلى العامل، بما فيه الأصول ذات الأسماء المبنية على التجزئة، ومع basePath يرسل أيضًا الطلبات خارج المسار الأساسي. يُعد كل طلب يشغّل العامل استدعاءً واحدًا لـFunctions ويُحتسب ضمن حصة طلبات Workers. في خطة ⁦Workers Free⁩، اضبط مشروع Pages على الإغلاق عند الفشل (الإعدادات → وقت التشغيل → الفتح / الإغلاق عند الفشل)، وإلا فستقدّم Pages ملفاتك دون middleware بمجرد نفاد الحصة اليومية.

    الإصلاحات

    • تعمل محررات أسلوب الإدخال الصينية واليابانية والكورية والمفاتيح الميتة في وحدات التحكم المضمّنة في textjs.org. كانت وحدات التحكم تمسح مساحة النص أثناء التكوين، فيتلقى التطبيق الحروف الخام أو المحرف الخطأ.
    • يحافظ <FocusPad> على تركيز لوحة المفاتيح داخل التطبيق بعد النقر. كان يفقد التركيز فورًا، مما منع محررات أسلوب الإدخال الصينية واليابانية والكورية من تكوين النص.
    • تصل المفاتيح الميتة التي لا تكوّن نصًا (في Windows، وفي Linux دون IME) إلى التطبيق مع تركيز مساحة النص المخفية. في تخطيط ⁦US-International⁩، يعطي ' ثم e المحرف é ويعطي ' ثم t النص 't. كان InputEngine يحظر حدث ضغط المفتاح الذي يكمل المفتاح الميت، فلا يُدرج المتصفح شيئًا. يسمح DeadKeyTracker في @textjs/core بمرور ذلك الحدث، وتستخدمه معاينة ⁦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 الخطأ عند فشل العرض المسبق لهياكل وحدة التحكم أو بناء المسارات المعروضة على الخادم. كان يخرج سابقًا بالرمز 1 بعد سطر «فشل البناء» من Vite، دون ذكر السبب.
    • يعيد text dev على Windows عرض المسارات المعروضة على الخادم عند تعديل ملف، ويعيد تحميل المتصفح عندما تغيّر صفحة قيمة التصدير runtime.
    • لم يعد text dev على Windows يشغّل middleware.ts لملفات المصدر التي يقدّمها Vite كوحدات، مثل /app/page.tsx، لذا لم تعد إعادة توجيه المصادقة تعطّل عميل التطوير.
    • يعمل text run و text mcp عندما يحتوي مسار المشروع على اسم Windows مختصر بصيغة 8.3، مثل C:\Users\RUNNER~1. كانا يعرضان «خطأ في التطبيق» لأن واجهة سطر الأوامر والتطبيق حمّلا @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 وما قبله للطلب بتجاوز middleware.ts عبر كتابة مسار محمي بطريقة أخرى، مثل /ad%6din أو /api//admin أو /admin%2Fx. كانت middleware تطابق المسار كما أُرسل، بينما كان البحث عن الصفحات ومعالجات المسارات والملفات الثابتة يجري بعد فك ترميزه (مرتين لمعالجات المسارات). أثّر ذلك في text dev و text start وعمليات البناء باستخدام --adapter bun و vercel و cloudflare. لا تستطيع عمليات البناء الثابتة استخدام middleware ولا تتأثر. رقّ إلى 1.2.0، ثم أعد البناء والنشر: .vercel/output لخدمة Vercel، و dist/ لخدمة ⁦Cloudflare Pages⁩، وكامل dist/ لخادم Bun (أعد تشغيل الخادم). احذف عمليات النشر القديمة التي لا تزال متاحة بعناوين URL الخاصة بها، أو احمها.
    • يحسب كل مضيف الآن اسم مسار موحّدًا واحدًا لكل طلب ويستخدمه للمطابق و request.nextUrl وكل عملية بحث. يفك تسلسلات الترميز المئوي ويعيد ترميز المسار كما يكتبه new URL()، ويحل المقطعين . و ..، ويزيل الشرطات المائلة المكررة والختامية. تحصل المسارات التي تحتوي على %2F أو %5C أو ترميز مئوي غير صالح على 400. يقدّم text dev و text start ومحوّل Bun الملفات الثابتة بأسمائها الدقيقة فقط، لذا لم يعد /ADMIN/report.txt يقدّم public/admin/report.txt على macOS و Windows.
    • تُقارن المطابقات ومصادر إعادة الكتابة ومقاطع المسارات و basePath بالصيغة المرمّزة نفسها لمسارات الطلبات، لذا يحمي matcher: "/café/:path*" و "/caf%c3%a9/:path*" المسار /caf%C3%A9، ويحمي "/ops%40corp/:path*" المسار /ops@corp. لا تعمل middleware دون مطابق خارج basePath. يطابق المطابق ذو الشرطة المائلة الختامية، مثل /admin/، المسار /admin، ويتجاهل شرط host النقطة الختامية في اسم المضيف.
    • لا تعرض جلسة حية لمسار runtime = "server" صفحة أعادت middleware كتابتها إلى مسار أو استعلام آخر، مثل إعادة الكتابة من /restricted إلى /login، أو أجابت عنها بحالة خطأ مثل NextResponse.next({ status: 403 }).
    • --adapter vercel: تحصل دالة معالج المسار على مسارها في ترويسة طلب لا تضبطها إلا المسارات المولّدة، لذا لم يعد /api/x/%252e%252e/admin يصل إلى /api/admin، ولا تشغّل أي صيغة من /_textjs/* الدالة. تطابق المسارات المولّدة مع مراعاة حالة الأحرف، لذا لم يعد /LEGACY/x يصل إلى إعادة كتابة للمسار /legacy/:path* لم تفحصها middleware. يمر كل مسار قد لا يكون موحّدًا، بما فيه المحارف الخام مثل {، عبر ⁦edge middleware⁩، التي أصبحت مضمنة في كل بناء لخدمة Vercel وتعيد كتابة الطلب إلى مساره الموحّد.
    • --adapter cloudflare: يجري البحث عن الملفات الثابتة بالمسار المرمّز، لذا لم يعد /x/%252e%252e/admin/report.txt يقدّم /admin/report.txt. مع basePath، لم تعد الملفات خارجه تُقدّم دون العامل.
    • لا يقدّم 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 px دون هوامش، ويعطّل الالتفاف التلقائي ويستخدم ستارًا بقيمة 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) إلى المتصفح بدلًا من الوصول إلى التطبيق.
    • يتعرّف التحجيم المتجاوب على أشرطة أدوات المتصفح التي يقل ارتفاعها عن 60 px (في Safari و Firefox) عندما تكون DevTools مغلقة، لتحصل وحدة التحكم المثبتة أسفل النافذة على كل الصفوف التي تتسع لها. يستخدم <FocusPad> الارتفاع المتعلّم لتحديد ما إذا كانت DevTools مثبتة.
    • يكتب <FocusPad> اختصارات Windows و Linux في حالة النقر بصيغة Ctrl+Shift+J.

    الأمان

    • @textjs/opencode: يطبع الجسر رمز اقتران عند بدء التشغيل، ويطلبه ⁦textjs.org/opencode⁩ عند الاتصال الأول. حتى ترسل صفحة الرمز، يجيب الجسر بالرمز 428 ولا يمرّر شيئًا إلى OpenCode، حتى من الأصول المسموح بها. يصلح كل رمز لتشغيل واحد للجسر، ولا يعمل الرمز المميّز الذي يعيده إلا من الأصل الذي اقترن، وتقفل عشرة رموز خاطئة الاقتران حتى إعادة تشغيل الجسر.
    • @textjs/opencode: لم تعد عمليات نشر معاينات textjs.org على ⁦Cloudflare Pages⁩ مسموحة افتراضيًا. مرّر --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 خصائص المشهد المنقّحة مسبقًا إلى المُصالِح بدلًا من نسخ كائنات الخصائص عند التركيب والتحديث.
    • @textjs/core: يتجاوز SceneNode.getTextModel() اجتياز الشجرة المضمّن في أوراق <Text> ذات السلسلة الواحدة، ويعيد استخدام مخازن runOf من نوع Uint16Array المصفّرة والمخزّنة مؤقتًا. يفحص CssConsoleDriver خلايا BMP المتتالية ذات النمط المتطابق في حلقة داخلية، ويتجاوز ConsoleRenderer الدالة countYogaNodes() في الإطارات غير المتغيرة.
    • textjs.org: تُقسّم المسارات وعلامات تبويب مرافق وحدة التحكم إلى أجزاء JS و CSS لكل مسار. تُعاد ترميز صور المتجر من النسخ الأصلية في photos/final، وتُحمّل لقطات المنتجات الثانوية عند تمرير المؤشر أو تغيير الشريحة.

    الإصلاحات

    • يستخدم <ViewportControl> قيمة minWidth بالبكسل بدلًا من 20ch ويسرد الخطوط البديلة المطابقة للمقاييس إلى جانب <FocusPad>، ليحافظ منتقي الحجم على عرضه عند تحميل Geist Mono.
  10. v1.0.2

    الإضافات

    • @textjs/opencode: جسر ⁦textjs.org/opencode⁩ في حزمة مستقلة دون اعتماديات. شغّل bunx @textjs/opencode proxy (أو npx) لبدئه دون تثبيت Vite و React وحزمة ⁦MCP SDK⁩. لا يزال text proxy يعمل ويشغّل الجسر نفسه.

    التغييرات

    • أصبحت حزمة إطار العمل وواجهة سطر الأوامر @textjs/app، بعد إعادة تسميتها من @textjs/next حتى لا يوحي الاسم بتكامل رسمي مع Next.js. أُهملت @textjs/next لصالح @textjs/app ولن تتلقى إصدارات جديدة. للانتقال، شغّل bun remove @textjs/next && bun add @textjs/app واستبدل @textjs/next بـ @textjs/app في الاستيرادات، بما فيها المسارات الفرعية مثل @textjs/app/link. تظل واجهة سطر الأوامر text، وتعتمد قوالب ⁦create-text-app⁩ على @textjs/app.
    • أصبح اسم زر [▼] والمفتّش داخل وحدة التحكم «طبقة التطوير»، ويقرأ عنوان المفتّش ▼ Dev Overlay · Turbolog. يقتصر اسم ⁦Text.js DevTools⁩ على إضافة Chrome. لم يتغير <TextDevOverlay> ولا خصائصه.
    • تفشل معالجات المسارات التي تصدّر dynamic = "error" بالرمز TX031. كان Text.js يعاملها كقيمة "force-static" دون التحقق مما إذا كان المعالج يقرأ الطلب، وهو ما تعنيه القيمة في Next.js. استخدم "force-static".

    الإصلاحات

    • يجيب text start عن Host المحظور بالرمز TX028، مثل text dev. يسمّي كل خادم الإعداد الذي يقرأه: 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). لكل عرض توضيحي عنوان URL خاص: يوجد 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 يحمّل نسخة ثانية من React عندما يقرأ فحص اعتماديات Vite ملفًا خاصًا بالخادم. كان الفحص يفعّل التحقق من الاستيراد الخاص بالخادم، الذي يطبع تتبع المكدس، ثم «استدعاء خطاف غير صالح» في وحدة التحكم، ويعطّل ⁦Fast Refresh⁩.
    • يتعامل text dev مع عناوين URL للصفحات ذات سلسلة استعلام، مثل /?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 مكتبة Yoga عند استيرادها، ليتمكن الاختبار من استبدال fetch بدالة وهمية قبل أول render().
  12. v1.0.0

    أول إصدار مستقر. ▼ Text.js 1.0.0 (Turbolog).

    التغييرات

    • تغيير غير متوافق: أصبحت حزمة إطار العمل وواجهة سطر الأوامر @textjs/next (الاسم textjs محجوز على npm). حدّث الاستيرادات من 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⁩) ويجتاز جميع حالات BidiTest.txt البالغ عددها 770,241 وحالات BidiCharacterTest.txt البالغ عددها 91,707. تُوصَل أشكال الحروف العربية، ويعزل <Text dir> عنصر span.
    • رموز أخطاء TX### مستقرة. تحمل أخطاء إطار العمل رمزًا ورابطًا إلى https://textjs.org/errors/<code>.
    • @textjs/react/testing لعرض المكوّنات كنص في الاختبارات.
    • @textjs/react/terminal و text run، الذي يعرض تطبيق ⁦App Router⁩ في طرفية حقيقية.
    • text mcp، الذي يقدّم تطبيقًا عبر بروتوكول سياق النموذج ليتمكن وكلاء البرمجة من التنقل فيه وضغط المفاتيح وقراءة الإطارات دون متصفح.
    • إضافة ⁦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: تمرّر علامات تبويب الملفات وكتل الشيفرة وجداول النص أفقيًا فقط، لذا لا يستحوذ ⁦iOS Safari⁩ على سحبات الصفحة العمودية.
    • textjs.org: تُطبّق scrollbar-gutter: stable على الأجهزة ذات الفأرة فقط. كانت تتسبب في قفزة عند التمرير الأول في ⁦iOS Safari⁩.
    • textjs.org: تثبيت موضع التمرير معطّل. كان يثبّت القسم الرئيسي تحت الرأس الثابت في ⁦iOS Safari⁩.
  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 عددًا قدره 67 من أصل 295 إطارًا صادرًا.
    • يمثّل كل من Playground و OpenCode لوحة تركيز بملء الشاشة.

    الأداء

    • ⁦CSS⁩ لعناصر span بخصائص مفصّلة فقط، مما يقلّل الخصائص التي تنسخها DevTools إلى كل سطر من نحو 33 إلى نحو 7. ألوان بالنظام الست عشري، وتسلسلات فارغة تُحدّد مفاتيحها بالخلفية فقط.
    • تحليل تزايدي لمحتوى Markdown وتخزين مؤقت لصفوف Markdown وCode وDiff.
    • معالجة خصائص المضيف بمرور واحد، وتحديثات متفرقة للخصائص، وعدم إعادة التخطيط باستخدام 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 وتقيس عمليات الرسم الفارغة والإطارات المسقطة وتأخر العرض واستهلاك 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 على مستوى الخلية، وسمات ومكوّن FocusPad في DOM.
    • textjs: نظام ⁦App Router⁩ المعتمد على نظام الملفات (layout، page، loading، error، not-found، والمقاطع الديناميكية، ومعالجات المسارات)، وtext dev، وtext build، وtext start، والمفتّش [▼] داخل وحدة التحكم.
    • create-text-app مع قالبَي starter وdashboard.