מה חדש ב-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 px במסך ברוחב 390 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 פחות JavaScript (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: רמז המיקוד ("יש ללחוץ על הדף כדי להשתמש במקלדת") הוא פס ענברי עם טקסט שחור מודגש בכל ערכת נושא. בעבר הוא השתמש בצבעי ערכת הנושא בהיפוך. בכל פעם שהוא מופיע, הוא מהבהב 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 מגיש ל-curl את דף ה-HTML. ראו 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, או להגדיר 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 או מקש מת מתוך textarea או שדה קלט מוסתרים, פעם אחת לכל אישור ולעולם לא באמצע ההרכבה. engine.bindTextSink(element) מחבר textarea שמרונדר באופן עצמאי ל-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 שולחת כל בקשה ל-worker, כולל נכסים ששמם כולל גיבוב, ועם basePath היא שולחת גם בקשות מחוץ לנתיב הבסיס. כל בקשה שמפעילה את ה-worker היא הפעלה אחת של Functions ונספרת במכסת הבקשות של Workers. בתוכנית ⁦Workers Free⁩, יש להגדיר את פרויקט Pages להיכשל במצב סגור (הגדרות → סביבת ריצה → כשל פתוח / סגור), אחרת Pages מגיש את הקבצים ללא middleware לאחר שהמכסה היומית נגמרת.

    תיקונים

    • שיטות קלט 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 מדפיס את השגיאה כשרינדור מראש של מעטפות מסוף או בניית נתיבים מרונדרים בצד השרת נכשלים. בעבר הוא יצא עם קוד 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. הם הציגו "שגיאת אפליקציה" מפני שה-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 ובגרסאות מוקדמות יותר אפשר לבקשה לדלג על 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 (יש להפעיל מחדש את השרת). יש למחוק פריסות ישנות שעדיין נגישות בכתובות שלהן, או להגן עליהן.
    • כל מארח מחשב כעת שם נתיב קנוני אחד לכל בקשה ומשתמש בו עבור מנגנון ההתאמה, 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. 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, קבצים שמחוצה לו כבר אינם מוגשים ללא ה-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 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, עם ה-layout הקטן, הבינוני והגדול שלה וההודעה "הטרמינל קטן מדי" מתחת ל-⁦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 עדיין פועלת ומפעילה את אותו גשר.

    שינויים

    • חבילת הפריימוורק וה-CLI היא כעת @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. ה-CLI עדיין נקרא text, ותבניות ⁦create-text-app⁩ תלויות ב-@textjs/app.
    • כפתור הגלולה [▼] ומפקח הרכיבים במסוף נקראים ⁦Dev Overlay⁩, וכותרת המפקח מציגה ▼ 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). לכל הדגמה יש כתובת משלה: OpenCode נמצא ב-/opencode ו-terminal.shop ב-/coffee, והלוגואים הטקסטואליים שלהם מופיעים בראש ההודעה. המונה והטופס הועברו אל מחוץ ל-Playground; התיעוד עדיין מפעיל את שניהם כדוגמאות חיות.
    • ל-<FocusPad> יש layout חדש. כל מצב מציג סרגל התקדמות בן שלושה חלקים, כותרת, רכיב גדול אחד ושורת טקסט. לפני פתיחת המסוף, הרכיב הגדול הוא קיצור המקשים של DevTools. בהמתנה ללחיצה, זהו מצביע. כשהאפליקציה פעילה, אלה ה-hints שלה כסמלי מקשים שנדלקים כשמתקבלות הקשות, ומקשים ללא רמז מוצגים מתחת. תוויות השלבים, תג ה-"פעיל" הנפרד והשורה "יש לצפות במסוף." הוסרו. שורות מופיעות בהדרגה בשינויי מצב, לעולם לא בצביעה הראשונה, והתנועה כבויה תחת prefers-reduced-motion. טקסט משני עומד בדרישות הניגודיות של ⁦WCAG AA⁩ בשני מצבי המראה, ובורר גודל המסוף מציג טבעת מיקוד כשמגיעים אליו באמצעות המקלדת.
    • textjs.org: ה-Playground משתמש ב-layout החדש של <FocusPad>. ההדגמה הנוכחית בבורר מקבלת את המשטח של סמלי המקשים, שדה הפקודה של OpenCode תואם לפינות ולגודל הטקסט של שדה הכתובת, ההערה של terminal.shop תופסת שתי שורות במקום שלוש, "הצגת המקור" ממוקם על קו הבסיס של בקרת הגודל, וטקסט משני במשטח עומד בדרישות הניגודיות של AA.

    תיקונים

    • text dev מגיש נתיבי proxy דרך שרת ה-proxy בכל בקשה. fetch() שולח Accept: */*, ולכן שרת הפיתוח השיב להם תחילה ב-HTML של האפליקציה, ותבנית opencode נכשלה בהפעלה הראשונה עם "אסימון לא צפוי '<'".
    • text dev כבר אינו טוען עותק שני של React כשסריקת התלויות של Vite קוראת קובץ המיועד לשרת בלבד. הסריקה הפעילה את בדיקת הייבוא לשרת בלבד, שהדפיסה עקבת מחסנית ולאחר מכן "קריאה לא תקינה להוק" במסוף, ושיבשה את ⁦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 משתנים, כך שהחלפת הדגמות במשטח אחד אינה מדווחת כהזזת layout.
    • @textjs/react/testing טוען את Yoga בזמן הייבוא, כך שבדיקה יכולה להחליף את fetch במימוש מדומה לפני ה-render() הראשון שלה.
  12. v1.0.0

    הגרסה היציבה הראשונה. ▼ Text.js 1.0.0 (Turbolog).

    שינויים

    • שינוי שובר תאימות: חבילת הפריימוורק וה-CLI היא כעת @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 והתראות קצרות.
    • layout: 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: הזזת ה-layout המצטברת היא 0 בכל נתיב. Playground ו-OpenCode חולקים layout אחד למשטח.
    • 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 fps וב-⁦81.1%⁩ ב-60 ⁦fps. span⁩ מוביל ברוחב אפס משמש כווילון שמסתיר פריימים קודמים. המסוף מתנקה רק בפריים הראשון, אחרי invalidate(), במצב סרק לאחר שנערמו 100 פריימים, או ב-300.
    • פריימים שנפלטים מתוזמנים במרווח של לפחות 66 ms זה מזה (כ-15 fps). פריימים מהירים יותר מפעילים מחדש את הגבלת הקצב של DevTools ונזרקים: ב-60 fps צייר DevTools רק 67 מתוך 295 פריימים שנפלטו.
    • Playground ו-OpenCode הם משטחי מיקוד במסך מלא.

    ביצועים

    • ⁦CSS⁩ של span עם מאפיינים מפורטים בלבד, שמצמצם את מספר המאפיינים ש-DevTools מעתיק לכל שורה מכ-33 לכ-7. צבעים הקסדצימליים ורצפים ריקים שהמפתח שלהם נקבע לפי הרקע בלבד.
    • פענוח מצטבר של Markdown ושמירה במטמון של שורות Markdown, Code ו-Diff.
    • עיבוד מאפייני רכיבי המארח במעבר יחיד, עדכוני מאפיינים דלילים וללא חישוב layout מחדש ב-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 על מערכים מטיפוס מוגדר במבנה שטוח, layout של ⁦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.