Nowości w Text.js
Wszystkie istotne zmiany w Text.js są udokumentowane w tym pliku.
Dodano
- textjs.org: wersje hiszpańska, francuska, niemiecka, portugalska brazylijska, koreańska oraz chińska uproszczona i tradycyjna nie są już wersjami roboczymi pod adresami textjs.org/es, /fr, /de, /pt-br, /ko, /zh-cn i /zh-tw. Wybór języka w stopce i przycisk języka przeglądarki oferują je tak samo jak wersję japońską. Wyszukiwarki indeksują przetłumaczone strony i wiążą każdą z jej angielską wersją.
- textjs.org: wersje włoska, rosyjska, turecka, polska, indonezyjska i wietnamska oraz wersja w języku hindi nie są już wersjami roboczymi pod adresami textjs.org/it, /ru, /tr, /pl, /id, /vi i /hi. Wybór języka w stopce i przycisk języka przeglądarki oferują je tak samo jak pozostałe wersje językowe. Wyszukiwarki indeksują przetłumaczone strony i wiążą każdą z jej angielską wersją.
Zmieniono
@textjs/react:<FocusPad>i<ViewportControl>wyświetlają etykiety o stałej szerokości znaków przy użyciu stosu fontów--monostrony, jeśli jest zdefiniowany, a w przeciwnym razie używają Geist Mono, jak dotąd. Strona z etykietami po arabsku lub hebrajsku może dodać fonty swojego pisma do--mono.
Naprawiono
- textjs.org: na telefonach kod w tekście dłuższy niż wiersz zawija się zamiast poszerzać stronę. Strona textjs.org/docs/internationalization była o 92 px za szeroka na ekranie o szerokości 390 px.
Dodano
@textjs/react:<FocusPad messages>zastępuje dowolne wbudowane teksty panelu na przetłumaczonych stronach. Obejmuje każdy wiersz, etykiety dla czytników ekranu i kontrolkę rozmiaru konsoli.<TextCanvas>i<ViewportControl>również przyjmująmessages.<ViewportControl>używa tylko kluczy kontrolki rozmiaru. Teksty zawierające wartość, takie jak „Potem kliknij tutaj i naciśnij ↑ ↓.”, są funkcjami zwracającymi całe zdanie.defaultFocusPadMessageszawiera tekst w języku angielskim. Zobacz Tłumaczenie panelu fokusu.@textjs/react: na stronach pisanych od prawej do lewej panel fokusu zachowuje kierunek od lewej do prawej dla symboli klawiszy, takich jak ⌘ ⌥ J, oraz rozmiarów konsoli, takich jak 120×36, a kontrolkę rozmiaru i pasek kroków wyświetla w odbiciu lustrzanym. Na stronach chińskich i japońskich usuwa spację między swoimi dwoma zdaniami; na koreańskich ją zachowuje.- textjs.org: textjs.org/ja nie jest już wersją roboczą. Wybór języka w stopce otwiera tę samą stronę po angielsku lub w języku 日本語. Przeglądarka ustawiona na język japoński otrzymuje przycisk 日本語で読む, a przeglądarka ustawiona na angielski na textjs.org/ja otrzymuje przycisk Czytaj po angielsku. Przycisk przestaje się pojawiać po wybraniu języka lub jego zamknięciu. Wyszukiwarki indeksują przetłumaczone strony japońskie i łączą każdą z jej angielską wersją.
- textjs.org: na textjs.org/ja panel fokusu jest po japońsku na każdej stronie, łącznie z etykietami pod klawiszami każdego dema.
Zmieniono
@textjs/core: konsole przeglądarek Chromium i Firefox czyszczą wyjście animowanych sprite’ów przy 16 MB zamiast 4 MB, więc textjs.org/doom pokazuje „Konsola została wyczyszczona” mniej więcej co 19 sekund zamiast co 4,5 sekundy. Safari oraz sprite’y rysowane półblokami▀zachowują limit 4 MB. Szczytowy rozmiar sterty strony textjs.org/doom rośnie z 10,8 MB do około 12–13 MB.- textjs.org: strona dokumentacji pobiera tylko własny Markdown zamiast wszystkich 33 stron, więc angielskie strony dokumentacji ładują o 43–47 KB mniej JavaScript (gzip), a strony dokumentacji /ja o 60–64 KB mniej. Najechanie kursorem na link do innej strony dokumentacji lub ustawienie na nim fokusu pobiera tę stronę wcześniej, więc nadal otwiera się od razu.
Naprawiono
- textjs.org/ja: wyszukiwarka ⌘K pokazuje japońskie nagłówki dokumentacji i dopasowuje do nich japońskie zapytania. Wcześniej wyświetlała angielskie nagłówki pod japońskimi tytułami stron. Angielskie nazwy nadal znajdują strony:
routingznajduje ルーティング, aopen the consoleznajduje コンソールを開く. - textjs.org: przykład z dokumentacji uruchomiony w twojej konsoli znów pokazuje zmiany w podglądzie na stronie textjs.org/ja oraz w przykładzie tekstu dwukierunkowego na textjs.org/docs/internationalization. Wiersz nad przykładem w konsoli ma teraz treść „▼ Dokumentacja › Licznik” zamiast „▼ Dokumentacja › Wprowadzenie › Licznik”.
Dodano
- textjs.org/doom odtwarza efekty dźwiękowe gry Doom, z jej własną panoramą stereo i tłumieniem zależnym od odległości. Dźwięk uruchamia się po pierwszym kliknięciu lub naciśnięciu klawisza na stronie, zatrzymuje się wraz z grą i stosuje ustawienie Sfx Volume w menu Options → Sound Volume gry Doom. Muzyki nie ma.
Zmieniono
@textjs/react,@textjs/app: wskazówka dotycząca fokusu („Kliknij stronę, aby używać klawiatury”) ma postać bursztynowego paska z pogrubionym czarnym tekstem w każdym motywie. Wcześniej używała odwróconych kolorów motywu. Za każdym pojawieniem się miga 4 razy przez około 6 sekund, a następnie pozostaje bursztynowa. Nie miga, gdy włączone jest ograniczenie ruchu. Każdy cykl migania zapisuje do 8 dodatkowych klatek konsoli.- textjs.org: grę Doom przeniesiono na textjs.org/doom. textjs.org/playground/doom przekierowuje pod ten adres.
Naprawiono
@textjs/core,@textjs/react: panel „Problemy” przeglądarki Chrome nie zgłasza już na każdej stronie komunikatu „Element pola formularza powinien mieć atrybut id lub name”. Ukryte pole klawiatury<textarea>ma nazwętextjs-input, a element<select>rozmiaru konsoli wViewportControl(także wsizeControlkomponentuFocusPad) maidi nazwętextjs-console-size. Pole klawiatury<textarea>wyłącza też obsługę 1Password, LastPass, Bitwarden i Dashlane.- textjs.org: nagłówek konsoli na textjs.org/doom ma treść „Text.js / doom” zamiast „Text.js / playground / doom”.
- textjs.org/doom: wąskie okno nie pozostawia już zbędnego „·” po „Zobacz źródło”.
- textjs.org: w wąskim oknie selektor dem w Playground wygasa przy krawędzi, za którą są dalsze dema do przewinięcia, zamiast ucinać ostatnie demo w środku słowa.
- textjs.org/doom działa z częstotliwością gry Doom wynoszącą 35 taktów na sekundę. Na poziomie działało 3,8× za szybko na ekranie 60 Hz (131 taktów na sekundę) i 5,5× przy 120 Hz (192), ponieważ strona uznawała dodatkowe odczyty zegara wykonywane przez grę Doom podczas rysowania poziomu za aktywne oczekiwanie i przesuwała zegar gry o jeden takt przy każdej klatce animacji i każdym wywołaniu zwrotnym timera.
Dodano
@textjs/react:<Image renderMode="halfblock">wszędzie rysuje półbloki▀, tak jak<Image>w wersji 1.3.@textjs/core/experimental:drawPixelsprzyjmujeencoding: "rgba"dla bezstratnego sprite’a z płynną przezroczystością alfa i ponad 256 kolorami oraz funkcjęfallback, która maluje komórki tam, gdzie nie można pokazać sprite’a.@textjs/app: curl, Wget, HTTPie i xh otrzymują pierwszą klatkę strony jako tekst ANSI z kolorami truecolor zamiast strony HTML wtext dev,text startoraz adapterachbun,vercelicloudflare.text buildwykonuje prerenderowanie klatek stron statycznych.text startibunrenderują strony dynamiczne i renderowane po stronie serwera na żądanie, a na nieznane ścieżki odpowiadają stroną aplikacji informującą o braku strony i kodem404. Domyślny rozmiar klatek to 80 × 24. Zmień rozmiar lub wyłącz klatki za pomocąansiwtext.config.tsalboexport const ansina stronie. Adapterstaticudostępnia curl stronę HTML. Zobacz curl i klienci terminalowi.@textjs/app/ansieksportujewantsAnsiiansiResponsedla serwerów, które nie używajątext startani adaptera, a@textjs/reacteksportujeframeToAnsi.- textjs.org: robocza wersja japońska pod adresem textjs.org/ja, począwszy od dokumentacji Wprowadzenie, Instalacja i Routing oraz interfejsu strony. Nieprzetłumaczone akapity są wyświetlane po angielsku. Nie jest jeszcze indeksowana ani dostępna w selektorze języka.
Zmieniono
@textjs/react:<Image>rysuje teraz pikselowy sprite w konsolach przeglądarek Chromium i Firefox, do 8 × 16 pikseli na komórkę dla pixel artu i 4 × 8 dla zdjęć. Celowo łamie to obietnicę z polityki wsparcia, że klatki wyglądają tak samo między wydaniami minor. PrzekażrenderMode="halfblock", aby zachować półbloki z wersji 1.3. Safari, terminale (w tymtext run), wyjście ANSI i zwykłego tekstu oraz strony renderowane po stronie serwera (runtime = "server") nadal rysują półbloki.@textjs/app: skrypty i testy dostępności pobierające strony przez curl, Wget, HTTPie lub xh otrzymują teraz tekst ANSI. Aby nadal otrzymywać HTML, wyślijAccept: text/htmllub ustawansi: falsewtext.config.ts.@textjs/app: asynchroniczne komponenty serwerowe nie uruchamiają się już, gdytext buildwykonuje prerenderowanie powłoki strony. Tak jak wcześniej pokazują zawartość zastępczą<Suspense>, bez rozpoczynania żądań danych podczas budowania.@textjs/app: odtwarzacz klatek stron renderowanych po stronie serwera jest mniejszy o 3 KB, 22,4 KB gzip zamiast 25,4 KB dlaexamples/dashboard. Nie zawiera już metod rysowania zCellBuffer, obramowań pól ani przycinania tekstu.
Naprawiono
@textjs/core: wykresy i wskaźniki ładowania zachowują siatkę w Windows 10. Czcionką konsoli jest tam Consolas, która nie ma bloków ósemkowych ▁▂▃▅▆▇, ćwiartek, znaków brajlowskich, ▶ ani ✓, a ich zastępcze glify wydłużały wiersze poza prawą krawędź klatki.CssConsoleDrivermierzy teraz jednorazowo, które z tych glifów czcionka konsoli rysuje z odchyleniem większym niż jedna piąta komórki, i rysuje je jako najbliższe glify dostępne w Consolas:_▄▌█dla ósemek, półbloki dla ćwiartek i znaków brajlowskich,►◄√×dla strzałek, znaczników wyboru i krzyżyków. Czcionki, w których te znaki pasują, takie jak Cascadia Mono w Windows 11 i Menlo w macOS, rysują oryginały.measureText: falsewyłącza to zachowanie.@textjs/core: nie ma już pionowych linii o szerokości 1 px między sąsiadującymi tłami w DevTools przeglądarek Chrome i Edge, na przykład obok „konto” i „ilość” na textjs.org/coffee. Chromium osobno wyrównuje każdy span%cdo pikseli urządzenia i mogło nie przypisać piksela na styku dwóch spanów do żadnego z nich.CssConsoleDriverwydłuża teraz tło spanu o 1 px pod nieprzezroczystego sąsiada po prawej (padding-right:1px;margin-right:-1px). Klatki w przeglądarkach Firefox i Safari nie zmieniają się.@textjs/core: sprite’y<Image>w przeglądarkach Chrome i Edge stosują tę samą regułę 1 px co tekst. Tekst po lewej stronie przezroczystego sprite’a nie maluje już paska swojego tła o szerokości 1 px na jego lewej krawędzi, a sprite szczelnie przylega do nieprzezroczystego tekstu po prawej, także tekstu z odwróconymi kolorami. Sprite zajmujący samodzielnie swoje wiersze sięga teraz prawej krawędzi klatki, tak jak wiersze tekstu nad nim i pod nim.@textjs/react:<ConsoleMirror>rysuje zdjęcie obok tekstu jako półbloki, tak jak konsola, zamiast jako obraz.
Dodano
@textjs/react/experimentaleksportuje<Pixels>dla buforów klatek aktualizowanych na żywo iuseKeyStatedla przytrzymanych klawiszy;@textjs/core/experimentaleksportujedrawPixels. Mogą się one zmienić w wydaniu minor.- textjs.org/playground/doom: zagraj w epizod shareware gry Doom w konsoli DevTools.
@textjs/react,@textjs/app: gdy strona nie ma fokusu, ostatni wiersz klatki konsoli wyświetla „Kliknij stronę, aby używać klawiatury”, dzięki czemu odwiedzający, który kliknie aplikację w konsoli, wie, dlaczego klawisze przestały działać. Wskazówka pojawia się, gdy aplikacja ma handleruseInputlubusePastealbo cel fokusu, tylko w konsoli przeglądarki, także na trasach renderowanych po stronie serwera. Osadzone podglądy lustrzane i podgląd VS Code jej nie pokazują. Wyłącz ją za pomocąfocusHint: falsewtext.config.tslubcreateConsoleRoot.@textjs/react:usePageFocus()zwraca informację, czy strona ma fokus. Aby samodzielnie decydować, kiedy aplikacja potrzebuje klawiatury, ustawfocusHint: falsei wyrenderuj<FocusHint active={…}>.useInput(handler, { ambient: true })oznacza zawsze aktywny skrót klawiszowy, który sam nie wywołuje wskazówki.
Zmieniono
@textjs/core: podczas animacji sprite’a<Pixels>komponentConsoleRenderergrupuje klatki kluczowe co 51 ms w Chromium, ustala odstęp między klatkami na 33 ms w Safari i czyści dopisane wyjście wCssConsoleDriverprzy 4 MB (SPRITE_MAX_BYTES). Statyczne sprite’y i aplikacje tekstowe zachowują dotychczasowe tempo i limit czyszczenia co 300 klatek.
Dodano
@textjs/core:bindTextSink(element, onText)odczytuje tekst zatwierdzony przez IME lub martwy klawisz z ukrytego pola textarea lub input, raz na zatwierdzenie i nigdy w trakcie składania tekstu.engine.bindTextSink(element)łączy samodzielnie renderowane pole textarea zInputEngine. Obie funkcje zwracają funkcję usuwającą nasłuchy zdarzeń.@textjs/app:POST /__textjs/inputprzyjmuje{ type: "text", text }dla tekstu z IME i martwych klawiszy.InputMessageiparseInputMessagew@textjs/app/frame-protocoluwzględniają ten typ.
Zmieniono
@textjs/app: middleware i handlery tras otrzymują ścieżkę kanoniczną./docs/i/docs//introtrafiają do nich jako/docsi/docs/intro, więc middleware przekierowujące w celu dodania końcowego ukośnika przekierowuje teraz bez końca. Usuń to przekierowanie. Segment dynamiczny nie może zawierać zakodowanego ukośnika:/files/a%2Fbzwraca400.@textjs/app: przy użyciu middleware--adapter cloudflarewysyła każde żądanie do workera, także żądania zasobów z hashami, a przybasePathrównież żądania spoza ścieżki bazowej. Każde żądanie uruchamiające workera to jedno wywołanie Functions, które wlicza się do limitu żądań Workers. W planie Workers Free ustaw projekt Pages tak, aby blokował dostęp przy awarii (Settings → Runtime → Fail open / closed), inaczej po wyczerpaniu dziennego limitu Pages będzie udostępniać pliki bez middleware.
Naprawiono
- Chińskie, japońskie i koreańskie IME oraz martwe klawisze działają w osadzonych konsolach textjs.org. Konsole czyściły pole textarea w trakcie składania tekstu, więc aplikacja otrzymywała surowe litery lub niewłaściwy znak.
<FocusPad>zachowuje fokus klawiatury w aplikacji po kliknięciu. Wcześniej od razu go tracił, więc chińskie, japońskie i koreańskie IME nie mogły składać tekstu.- Martwe klawisze, które nie składają znaków (Windows i Linux bez IME), docierają do aplikacji, gdy fokus jest w ukrytym polu textarea. W układzie US-International
', a następnieedajeé, a', a następnietdaje't.InputEngineblokował zdarzenie keydown kończące obsługę martwego klawisza, więc przeglądarka nic nie wstawiała.DeadKeyTrackerw@textjs/coreprzepuszcza to zdarzenie keydown, a podgląd VS Code również z niego korzysta. - Podgląd VS Code dostarcza tekst z IME i martwych klawiszy, który wcześniej odrzucał, i nie przekazuje już do aplikacji martwych klawiszy ani naciśnięć klawiszy służących do składania tekstu przez IME. Z serwerem
text devz pakietu@textjs/appw wersji 1.1.0 lub starszej wysyła tekst jako naciśnięcia klawiszy lub wklejenie. @textjs/core:InputEngine.handleTextInputignoruje tekst, gdyshouldCapturezwracafalse, tak jak już wcześniej obsługa klawiszy i wklejania.text devwstępnie pakuje@textjs/app/live-stubi@textjs/app/live-player. Aplikacja ze stronąruntime = "server"znajdowała je dopiero po pierwszym załadowaniu strony, więc Vite pakował je ponownie podczas ładowania, co powodowało błędy 404 dla nieaktualnych fragmentów oraz komunikat „Nieprawidłowe wywołanie hooka” z powodu dwóch kopii React.- Wykresy i wskaźniki ładowania mieszczą się w klatce w Windows. Consolas nie ma bloków ▁▂▃▅▆▇, ćwiartek, znaków brajlowskich, ▶ ani ✓, więc Windows rysował je czcionkami zastępczymi o szerokości do 1,8 komórki, a wiersze wykresów wychodziły poza prawą krawędź klatki. Stos czcionek konsoli to teraz
"SF Mono",Menlo,"Cascadia Mono",Consolas,monospace, a Windows 11 rysuje całą klatkę czcionką Cascadia Mono.<ConsoleMirror>, podgląd VS Code i widok klatki rozszerzenia DevTools również umieszczają Cascadia Mono przed Consolas. @textjs/opencode: w środowisku Node na Windows most znajduje OpenCode zainstalowane przeznpm i -g opencode-ai. Node nie może uruchomić po nazwie skryptu pośredniczącegoopencode.cmdz npm, więc most zachowywał się tak, jakby OpenCode nie było zainstalowane. Teraz przeszukujePATHz każdym rozszerzeniemPATHEXTi uruchamia skrypty pośredniczące.cmdprzezcmd.exe. W środowisku Bun (bunx) już to działało.text builddziała w Windows. Kończyło się niepowodzeniem dla każdego szablonu, z komunikatemCould not resolve entry module "virtual:textjs/api"lub bez komunikatu błędu.text buildwypisuje błąd, gdy prerenderowanie powłok konsoli lub budowanie tras renderowanych po stronie serwera kończy się niepowodzeniem. Wcześniej kończyło działanie z kodem 1 po wierszu „Budowanie nie powiodło się” z Vite, bez podania przyczyny.text devw Windows ponownie renderuje trasy renderowane po stronie serwera po edycji pliku i przeładowuje przeglądarkę, gdy strona zmienia eksportruntime.text devw Windows nie uruchamia jużmiddleware.tsdla plików źródłowych udostępnianych przez Vite jako moduły, takich jak/app/page.tsx, więc przekierowanie uwierzytelniania nie psuje już klienta deweloperskiego.text runitext mcpdziałają, gdy ścieżka projektu zawiera krótką nazwę Windows 8.3, taką jakC:\Users\RUNNER~1. Pokazywały „Błąd aplikacji”, ponieważ CLI i aplikacja ładowały@textjs/appdwukrotnie.- Katalog
dist/zbudowany w Windows udostępnia swoje prerenderowane strony w Linux i macOS. Manifest tras działających na żywo przechowywał ścieżki z ukośnikami odwrotnymi. text builddziała, gdy opcjavitewtext.config.tsustawiabuild.rollupOptions.input. To ustawienie zastępowało punkty wejścia pakietów API, tras renderowanych po stronie serwera i adapterów, przez co budowanie kończyło się niepowodzeniem.text devkończy działanie, gdy zatrzymasz je w pierwszych sekundach po załadowaniu strony, aserver.close()się rozwiązuje. Zamykanie Vite podczas optymalizacji nowo wykrytych zależności nigdy się nie kończyło (vitejs/vite#22934).
Bezpieczeństwo
@textjs/appw wersji 1.1.0 i starszych pozwalało żądaniu ominąćmiddleware.tsprzez inny zapis chronionej ścieżki, taki jak/ad%6din,/api//adminlub/admin%2Fx. Middleware dopasowywało ścieżkę w wysłanej postaci, natomiast strony, handlery tras i pliki statyczne wyszukiwano po jej zdekodowaniu (dwukrotnym dla handlerów tras). Dotyczyło totext dev,text startoraz kompilacji z--adapter bun,vercelicloudflare. Kompilacje statyczne nie mogą używać middleware i nie są objęte problemem. Zaktualizuj do 1.2.0, a następnie ponownie zbuduj i wdroż:.vercel/outputdla Vercel,dist/dla Cloudflare Pages i całydist/dla Bun (uruchom ponownie serwer). Usuń stare wdrożenia nadal dostępne pod własnymi adresami URL lub je zabezpiecz.- Każdy host wyznacza teraz jedną kanoniczną ścieżkę dla każdego żądania i używa jej w matcherze,
request.nextUrli każdym wyszukiwaniu. Dekoduje sekwencje procentowe i ponownie koduje ścieżkę tak, jak zapisuje jąnew URL(), rozwiązuje segmenty.i..oraz usuwa powtórzone i końcowe ukośniki. Ścieżki z%2F,%5Club nieprawidłowym kodowaniem procentowym otrzymują400.text dev,text starti adapter Bun udostępniają pliki statyczne tylko pod ich dokładną nazwą, więc w macOS i Windows/ADMIN/report.txtnie udostępnia jużpublic/admin/report.txt. - Matchery, źródła reguł rewrite, segmenty tras i
basePathsą porównywane w tej samej zakodowanej postaci co ścieżki żądań, więcmatcher: "/café/:path*"i"/caf%c3%a9/:path*"chronią/caf%C3%A9, a"/ops%40corp/:path*"chroni/ops@corp. Middleware bez matchera nie uruchamia się pozabasePath. Matcher z końcowym ukośnikiem, taki jak/admin/, dopasowuje/admin, a warunekhostignoruje końcową kropkę w nazwie hosta. - Sesja na żywo dla trasy
runtime = "server"nie renderuje strony, dla której middleware przepisało ścieżkę lub zapytanie, na przykład z/restrictedna/login, albo odpowiedziało statusem błędu, takim jakNextResponse.next({ status: 403 }). --adapter vercel: funkcja handlera trasy otrzymuje ścieżkę w nagłówku żądania ustawianym tylko przez wygenerowane trasy, więc/api/x/%252e%252e/adminnie dociera już do/api/admin, a żaden zapis/_textjs/*nie uruchamia funkcji. Wygenerowane trasy rozróżniają wielkość liter, więc/LEGACY/xnie trafia już do reguły rewrite dla/legacy/:path*, której middleware nigdy nie sprawdziło. Każda ścieżka, która może nie być kanoniczna, w tym surowe znaki takie jak{, przechodzi przez middleware edge, które jest teraz dołączane do każdej kompilacji Vercel i przepisuje żądanie na jego ścieżkę kanoniczną.--adapter cloudflare: pliki statyczne są wyszukiwane przy użyciu zakodowanej ścieżki, więc/x/%252e%252e/admin/report.txtnie udostępnia już/admin/report.txt. PrzybasePathpliki spoza tej ścieżki nie są już udostępniane bez workera.text devnie udostępnia plikówpublic/pod/public/…ani/@fs/…, źródeł tylko serwerowych, takich jakmiddleware.tsitext.config.ts, z inną wielkością liter, pod zakodowaną ścieżką/@fs/, jako żądań modułów bez rozszerzenia (/text.config?import) ani przez regułę rewrite w konfiguracji, ani handlerów tras pozabasePath.
Dodano
- Text.js renderuje w konsolach przeglądarek Firefox i Safari.
CssConsoleDriverwykrywa przeglądarkę przez testy obsługi funkcji CSS. Tam, gdzie spany%cpozostają w jednym wierszu, ustawia wysokość wiersza na 14 px bez marginesów, wyłącza miękkie zawijanie i używa kurtynyline-height: 100vh. - Responsywne dopasowanie rozmiaru pozostawia miejsce na kolumnę linków do źródeł w przeglądarce Firefox. Safari umieszcza Menlo na początku stosu czcionek: jego strony nie mogą używać czcionki SF Mono zainstalowanej przez użytkownika, choć Web Inspector może nią rysować.
- Przekaż
browser: "chromium" | "firefox" | "safari"docreateConsoleRoot,ConsoleRendererlubCssConsoleDriver, aby wybrać konsolę. - Prerenderowane powłoki zawierają CSS dla obu rodzajów konsoli.
<FocusPad>pokazuje skrót klawiszowy konsoli dla przeglądarki odwiedzającego: ⌘⌥K lub Ctrl+Shift+K w przeglądarce Firefox oraz ⌘⌥C w przeglądarce Safari z informacją, by włączyć „Pokazuj funkcje dla deweloperów witryn”.- Prerenderowany
<FocusPad>renderuje skróty klawiszowe wszystkich przeglądarek. Ustawdata-browser(firefoxlubsafari) idata-os(mac) na<html>przed pierwszym malowaniem, aby pokazać tylko skrót odwiedzającego; bez nich do czasu hydratacji pokazuje skrót przeglądarki Chrome dla Windows i Linux.
Naprawiono
- ⌘⌥K i Ctrl+Shift+K (skrót klawiszowy konsoli przeglądarki Firefox) trafiają do przeglądarki zamiast do aplikacji.
- Responsywne dopasowanie rozmiaru uczy się wysokości pasków narzędzi przeglądarki poniżej 60 px (w przeglądarkach Safari i Firefox), gdy DevTools jest zamknięte, więc konsola zadokowana u dołu otrzymuje wszystkie mieszczące się wiersze.
<FocusPad>używa poznanej wysokości do ustalenia, czy DevTools jest zadokowane. <FocusPad>zapisuje skróty klawiszowe Windows i Linux w stanie oczekiwania na kliknięcie jakoCtrl+Shift+J.
Bezpieczeństwo
@textjs/opencode: most wypisuje kod parowania przy uruchomieniu, a textjs.org/opencode pyta o niego przy pierwszym połączeniu. Dopóki strona nie wyśle kodu, most odpowiada428i nic nie przekazuje do OpenCode, nawet dla dozwolonych źródeł. Każdy kod jest ważny przez jedno uruchomienie mostu, zwrócony token działa tylko ze źródła, które wykonało parowanie, a dziesięć błędnych kodów blokuje parowanie do ponownego uruchomienia mostu.@textjs/opencode: wdrożenia podglądowe textjs.org w Cloudflare Pages nie są już domyślnie dozwolone. Przekaż--allow-origin, aby z nich korzystać.- textjs.org/opencode odrzuca mosty z
@textjs/opencode1.0.x. Uruchombunx @textjs/opencode@latest proxy. - textjs.org wysyła Content-Security-Policy,
Strict-Transport-Security,Cross-Origin-Opener-PolicyiCross-Origin-Resource-Policy. Strona OpenCode łączy się tylko z serwerami pod127.0.0.1lublocalhost.
- Text.js renderuje w konsolach przeglądarek Firefox i Safari.
Dodano
- OpenCode Lite: przeglądaj różnice w poszczególnych plikach i historię promptów, konfiguruj skróty z klawiszem prefiksowym oraz zarządzaj kontami dostawców i serwerami MCP. Piaskownica zawiera panel terminala sterowany skryptem.
- OpenCode Lite: wpisz
/, aby wyszukać polecenia, lub@, aby dołączyć plik projektu. Tab otwiera katalog w menu plików. Połączone sesje przeszukują projekt serwera; piaskownica przeszukuje swoje przykładowe repozytorium. - textjs.org/coffee: demo terminal.shop dostosowuje się do rozmiaru konsoli tak jak aplikacja SSH, z małym, średnim i dużym layoutem oraz komunikatem „twój terminal jest za mały” poniżej 20 × 10. Konto zyskuje metody płatności, profil z edytowalną nazwą i zmiany tygodniowego harmonogramu subskrypcji. Po wylogowaniu koszyk oraz sekcje konta z częstymi pytaniami, informacjami o usłudze i danymi diagnostycznymi otwierają się bez logowania.
Wydajność
@textjs/react:BoxiTextprzekazują do reconcilera wcześniej oczyszczone propsy sceny zamiast kopiować obiekty propsów przy montowaniu i aktualizacji.@textjs/core:SceneNode.getTextModel()pomija przechodzenie po drzewie inline dla liści<Text>z pojedynczym ciągiem znaków i ponownie wykorzystuje buforowane wyzerowane buforyUint16ArrayrunOf.CssConsoleDriverskanuje kolejne komórki BMP o zgodnym stylu w wewnętrznej pętli, aConsoleRendererpomijacountYogaNodes()w niezmienionych klatkach.- textjs.org: trasy i karty panelu towarzyszącego konsoli są dzielone na fragmenty JS i CSS dla poszczególnych tras. Zdjęcia sklepu są ponownie kodowane z plików źródłowych
photos/final, a dodatkowe zdjęcia produktów ładują się po najechaniu kursorem lub zmianie slajdu.
Naprawiono
<ViewportControl>używaminWidthw pikselach zamiast20chi wymienia czcionki zastępcze o dopasowanych metrykach tak jak<FocusPad>, więc selektor rozmiaru zachowuje szerokość po załadowaniuGeist Mono.
Dodano
@textjs/opencode: most textjs.org/opencode jako osobny pakiet bez zależności. Uruchombunx @textjs/opencode proxy(lubnpx), aby uruchomić go bez instalowania Vite, React i MCP SDK.text proxynadal działa i uruchamia ten sam most.
Zmieniono
- Pakiet frameworka i CLI to teraz
@textjs/app, przemianowany z@textjs/next, aby nazwa nie sugerowała oficjalnej integracji z Next.js.@textjs/nextjest przestarzały na rzecz@textjs/appi nie otrzymuje nowych wydań. Aby przejść na nowy pakiet, uruchombun remove @textjs/next && bun add @textjs/appi zastąp@textjs/nextprzez@textjs/appw importach, także w podścieżkach takich jak@textjs/app/link. CLI nadal nazywa siętext, a szablony create-text-app zależą od@textjs/app. - Przycisk
[▼]i inspektor w konsoli noszą nazwę Dev Overlay, a tytuł inspektora to▼ Dev Overlay · Turbolog. Text.js DevTools to nazwa wyłącznie rozszerzenia przeglądarki Chrome.<TextDevOverlay>i jego propsy pozostają bez zmian. - Handlery tras eksportujące
dynamic = "error"kończą się błędemTX031. Text.js traktowało tę wartość jak"force-static"bez sprawdzania, czy handler odczytuje żądanie, co ta wartość oznacza w Next.js. Użyj"force-static".
Naprawiono
text startodpowiada na zablokowanyHostkodemTX028, tak jaktext dev. Każdy serwer podaje nazwę odczytywanego ustawienia:vite.server.allowedHostsdlatext deviserver.allowedHostsdlatext start.- textjs.org: rozdział Wdrażanie w sekcji Nauka nie poleca już dodawania reguły rewrite w
vercel.json. Na Vercel i Cloudflare Pagestext buildsamodzielnie zapisuje zastępczyindex.html. Przykład reguły rewrite używa teraz pliku_redirectsplatformy Netlify. eslint-plugin-textjs:route-handler-exportsdopuszcza eksportydynamicirevalidatewroute.ts, avalid-route-modulesprawdza tam wartościdynamic.
Dodano
- textjs.org: odtwarzany film rozdziału w sekcji Nauka przenosi się do miniodtwarzacza w rogu, gdy przewiniesz stronę poza niego. Przycisk Napisy pod każdym filmem włącza lub wyłącza napisy i zapamiętuje wybór.
<TextDevOverlay>przyjmuje propsypill,shortcutishell, więc aplikacje bez App Router mogą zamontować inspektor z własnymi klawiszami i kontrolkami motywu.<FocusPad>przyjmujebanner, wyświetlany jako pierwszy wiersz komunikatu (na przykład logotyp aplikacji) i nad powiadomieniem na urządzeniach dotykowych.
Zmieniono
- textjs.org: selektor Playground wymienia Panel, Strumieniowanie, Węża, OpenCode i Kawę (terminal.shop). Każde demo ma własny URL: OpenCode jest pod
/opencode, a terminal.shop pod/coffee, a ich logotypy znajdują się na początku komunikatu. Licznik i Formularz przeniesiono poza Playground; dokumentacja nadal uruchamia oba jako przykłady na żywo. <FocusPad>ma nowy layout. Każdy stan pokazuje trzyczęściowy pasek postępu, nagłówek, jeden duży element i wiersz tekstu. Przed otwarciem konsoli dużym elementem jest skrót klawiszowy DevTools. Podczas oczekiwania na kliknięcie jest nim wskaźnik. Po uruchomieniu są nimhintsaplikacji w postaci klawiszy podświetlanych przy naciśnięciu, a klawisze bez wskazówki są wyświetlane poniżej. Usunięto etykiety kroków, osobną odznakę „Na żywo” i wiersz „Obserwuj konsolę.”. Wiersze pojawiają się płynnie przy zmianie stanu, nigdy przy pierwszym malowaniu, a ruch jest wyłączony przyprefers-reduced-motion. Tekst drugorzędny spełnia wymagania kontrastu WCAG AA w obu wariantach wyglądu, a selektor rozmiaru konsoli pokazuje obwódkę fokusu po przejściu do niego klawiaturą.- textjs.org: Playground używa nowego layoutu
<FocusPad>. Bieżące demo w selektorze ma powierzchnię klawiszy, pole polecenia OpenCode ma takie same narożniki i rozmiar tekstu jak pole URL, uwaga terminal.shop zajmuje dwa wiersze zamiast trzech, „Zobacz źródło” znajduje się na linii bazowej kontrolki rozmiaru, a stonowany tekst w panelu spełnia wymagania kontrastu AA.
Naprawiono
text devobsługuje ścieżkiproxyprzez proxy dla każdego żądania.fetch()wysyłaAccept: */*, więc serwer deweloperski najpierw odpowiadał na nie kodem HTML aplikacji, a szablon opencode kończył pierwsze uruchomienie błędem „Nieoczekiwany token '<'”.text devnie ładuje już drugiej kopii React, gdy skanowanie zależności Vite odczytuje plik tylko serwerowy. Skanowanie uruchamiało kontrolę importu tylko serwerowego, która wypisywała stos wywołań, następnie „Nieprawidłowe wywołanie hooka” w konsoli i psuła Fast Refresh.text devobsługuje adresy URL stron z ciągiem zapytania, takie jak/?demo. Vite traktował je jak folder projektu i obserwował cały dysk, więc w Linux strona nigdy się nie ładowała.- create-text-app: przycisk deweloperski nie zasłania już pierwszej wskazówki klawisza na pierwszym ekranie żadnego szablonu, domyślna nazwa projektu to
my-appzgodnie z dokumentacją, szablony przechodzą zalecaną konfiguracjęeslint-plugin-textjs, a README panelu wyjaśnia budowanie z--adapter static. <FocusPad>i<ViewportControl>ustawiają obramowania wyłącznie za pomocą właściwości nieskróconych. React ostrzegał „Aktualizacja właściwości stylu podczas ponownego renderowania (border)” w trybie deweloperskim przy każdym mignięciu wskazówki klawisza.- Tekst będący ostatnim elementem w wierszu zachowuje teraz pozycję, gdy staje się krótszy. Po
<Spacer>pozostawał w miejscu wyznaczonym przez najdłuższy tekst, a elementy sąsiednie zmniejszone do przepełnionego wiersza pozostawały zmniejszone. <FocusPad>zastępuje swoje kroki, podtytuł i wiersze klawiszy po zmianieactionlubhints, więc przełączanie dem w jednym panelu nie jest zgłaszane jako przesunięcie layoutu.@textjs/react/testingładuje Yoga przy imporcie, więc test może podstawić atrapęfetchprzed pierwszymrender().
Pierwsze stabilne wydanie.
▼ Text.js 1.0.0 (Turbolog).Zmieniono
- Zmiana niezgodna wstecz: pakiet frameworka i CLI to teraz
@textjs/next(textjsjest zajęte w npm). Zmień importy ztextjsna@textjs/next. - Most OpenCode to
bunx @textjs/app proxyi działa z dowolnego katalogu. - Konsola domyślnie dopasowuje się do zadokowanego panelu DevTools (dokowanie u dołu, po lewej lub prawej, powiększenie strony, zawijanie paska narzędzi). Niezadokowane DevTools używa rozmiaru zastępczego
120×36. Panele zyskały kontrolkę rozmiaru.
Dodano
useKeymapz automatycznym ekranem pomocy?, wskazówkami klawiszy i paletą poleceńCtrl+K.- Komponenty danych:
List(wirtualizowany),Table,Tree. - Wykresy:
LineChart,BarChart,Sparkline,ProgressBar, a takżeGradientiImage. - Kontrolki:
Button,Checkbox,Switch,RadioGroup,Slider,Dialog,Confirmi powiadomienia typu toast. - Layout:
Center,Stack,Grid,SplitPane,FocusScope. - Hooki do timerów, animacji, pomiarów, breakpointów, przechowywania danych i schowka.
- Tekst od prawej do lewej. Text.js implementuje algorytm dwukierunkowy Unicode (UAX #9, Unicode 18.0) i przechodzi wszystkie 770 241 przypadków
BidiTest.txti 91 707 przypadkówBidiCharacterTest.txt. Znaki arabskie otrzymują odpowiednie formy, a<Text dir>izoluje span. - Stabilne kody błędów
TX###. Błędy frameworka zawierają kod i link dohttps://textjs.org/errors/<code>. @textjs/react/testingdo renderowania komponentów do tekstu w testach.@textjs/react/terminalitext run, które renderuje aplikację App Router w prawdziwym terminalu.text mcp, które udostępnia aplikację przez Model Context Protocol, aby agenci programistyczni mogli po niej nawigować, naciskać klawisze i odczytywać klatki bez przeglądarki.- Rozszerzenie Text.js DevTools, panel obok Konsoli z drzewem komponentów, inspektorem klatek i osią czasu.
eslint-plugin-textjsi rozszerzenie VS Code z podglądami na żywo.apps/terminal-shop: sklep terminal.shop w konsoli korzystający z prawdziwego API (domyślnie piaskownica deweloperska, produkcja zabezpieczona podwójnie).- textjs.org: Nauka, 10-rozdziałowy kurs działający w konsoli. Prerenderowanie podczas budowania z hydratacją, samodzielnie hostowane czcionki o dopasowanych metrykach, trasy
.htmlbez ukośników i nowe strony dokumentacji z podglądami na żywo.
Wydajność
- Przerwano blokadę fazową ograniczania częstotliwości DevTools po czyszczeniu. Po klatce czyszczącej renderer czeka jednorazowo 110 ms, aby kolejne klatki trafiały na natychmiastową ścieżkę DevTools. Opóźnienie wyświetlania p50 spadło z 63 ms do 10 ms.
- Częściowe malowanie pasm zmian: ponownie malowane są tylko pasma wierszy objęte mutacją.
- Buforowane hashe wierszy, całkowitoliczbowe identyfikatory stylów i klatki bezczynności bez alokacji.
- Zero timerów bezczynności, gdy strona jest ukryta lub nie ma fokusu.
Naprawiono
- Brak pozornych pustych spanów warstwy malowania na końcach wierszy i brak podwójnej kurtyny.
- Kurtyna zajmuje własny wiersz, więc link do źródła w DevTools (
VM12:1) nigdy nie zawija wiersza 0. - Domyślny wskaźnik ładowania dokładnie pasuje do komórek (Menlo nie ma glifów brajlowskich). Wariant
braillewymaga jawnego włączenia. text buildw środowisku Node nie pakuje już deweloperskich kompilacji React.- textjs.org: skumulowane przesunięcie layoutu wynosi 0 na każdej trasie. Playground i OpenCode współdzielą jeden layout panelu.
- textjs.org: paski boczne dokumentacji i sekcji Nauka pozostają przypięte u dołu długich stron.
- textjs.org: karty plików, bloki kodu i tabele w tekście przewijają się tylko poziomo, więc Safari w iOS nigdy nie przechwytuje pionowych gestów przewijania strony.
- textjs.org:
scrollbar-gutter: stabledotyczy tylko urządzeń z myszą. W Safari na iOS powodowało skok przy pierwszym przewinięciu. - textjs.org: kotwiczenie przewijania jest wyłączone. W Safari na iOS przypinało sekcję główną pod przyklejonym nagłówkiem.
- Zmiana niezgodna wstecz: pakiet frameworka i CLI to teraz
Klatki bez migania i renderowanie po stronie serwera.
Zmieniono
- Klatki są dopisywane zamiast wywoływania
console.clear()+console.log()dla każdej klatki. DevTools czyści konsolę synchronicznie, ale rysuje nowe komunikaty z ograniczeniem częstotliwości do 50 ms, więc czyszczenie pozostawiało pustą konsolę w 70,6% odrysowań DevTools przy 15 kl./s i 81,1% przy 60 kl./s. Początkowy span kurtyny o zerowej szerokości ukrywa wcześniejsze klatki. Konsola jest czyszczona tylko przy pierwszej klatce, poinvalidate(), w stanie bezczynności po zebraniu 100 klatek lub po 300 klatkach. - Emitowane klatki są rozdzielone odstępem co najmniej 66 ms (około 15 kl./s). Szybsze klatki ponownie uruchamiają ogranicznik częstotliwości DevTools i są odrzucane: przy 60 kl./s DevTools narysowało 67 z 295 wyemitowanych klatek.
- Playground i OpenCode to pełnoekranowe panele fokusu.
Wydajność
- CSS spanów używający wyłącznie właściwości nieskróconych, co zmniejsza liczbę właściwości kopiowanych przez DevTools do każdego wiersza z około 33 do około 7. Kolory szesnastkowe i ciągi pustych komórek z kluczem opartym wyłącznie na tle.
- Przyrostowe parsowanie Markdown i memoizowane wiersze
Markdown,CodeiDiff. - Jednoprzebiegowe przetwarzanie propsów hosta, aktualizacje tylko zmienionych propsów i brak ponownego obliczania layoutu przez Yoga, gdy rozmiar tekstu nie może się zmienić.
- Czas klatki strumieniowej spadł z 0,79 ms do 0,14 ms, a kroku spinnera z 0,90 ms do 0,056 ms. Wynik jest identyczny bitowo.
Dodano
- Renderowanie po stronie serwera. Strona eksportująca
runtime = "server"renderuje się na serwerze, łącznie z komponentamiasync function, i przesyła strumieniowo zmiany komórek na poziomie wierszy przez zdarzenia wysyłane przez serwer do odtwarzacza klatek o rozmiarze około 19 kB po kompresji gzip. - Częściowe prerenderowanie.
text buildosadza pierwszą klatkę każdej trasy statycznej w jej HTML, więc konsola rysuje ją, zanim załaduje się jakikolwiek moduł. middleware.ts, konfiguracja segmentów tras (dynamic,revalidate) itextjs/cache(unstable_cache,revalidateTag,revalidatePath).text build --adapter static|bun|vercel|cloudflare.bench/devtools: narzędzie testowe sterujące rzeczywistym frontendem DevTools i mierzące puste odrysowania, odrzucone klatki, opóźnienie wyświetlania i zużycie CPU przez DevTools.
Naprawiono
- DevTools nie zamienia już tekstu
path:line,//host:portidata:w linki. - Most OpenCode znajduje zarządzany demon (port efemeryczny, uwierzytelnianie podstawowe), wysyła nagłówek CSRF przy zapisie i zgłasza błędy w jednym wierszu.
- Klatki są dopisywane zamiast wywoływania
Zmieniono
- Pojedyncze zdarzenia wejściowe (naciśnięcie klawisza, wklejenie) powodują synchroniczne renderowanie w tym samym zadaniu zamiast oczekiwania na następną klatkę animacji.
- Uproszczony interfejs TUI OpenCode zgodny z oryginałem.
- Pełna aktualizacja textjs.org pod kątem urządzeń mobilnych i responsywności.
Dodano
@textjs/font: parser i renderer czcionek FIGlet z 17 dołączonymi czcionkami, dla<FigletText>i<AsciiFont>. Wynik odpowiada 273 wzorcom zapisanym z pliku binarnegofiglet2.2.5.text proxy: lokalny most CORS umożliwiający textjs.org komunikację z twoim serwerem OpenCode.
Dodano
apps/opencode-console: połączony klient OpenCode renderowany wconsole.log, z trybem demonstracyjnym, gdy żaden serwer nie działa.- Szablon
opencodedlacreate-text-app. - textjs.org: nowa strona główna, panel towarzyszący konsoli na żywo, Playground, strona OpenCode i dokumentacja.
- Proces wdrażania w GitHub Pages z generowaniem tras statycznych.
Pierwszy kamień milowy.
Dodano
@textjs/core:CellBufferoparty na płaskich tablicach typowanych, layout Yoga WASM, pomiar tekstu przezIntl.Segmenteri sterownik kodowania długości serii%c. Jedno wywołanieconsole.logna zmienioną klatkę i żadne w stanie bezczynności.@textjs/react: reconciler React 19, komponenty PascalCase (Box,Text,ScrollBox,Input,Textarea,Select,Tabs,Code,Markdown,Diff,Modal,Spinneri inne), narzędziaclassNamew stylu Tailwind na poziomie komórek, motywy i DOM-owyFocusPad.textjs: App Router oparty na systemie plików (layout,page,loading,error,not-found, segmenty dynamiczne, handlery tras),text dev,text build,text starti inspektor[▼]w konsoli.create-text-appz szablonamistarteridashboard.