diff --git a/packages/manifest.json b/packages/manifest.json index 06f6bd2d9..6ed57f39a 100644 --- a/packages/manifest.json +++ b/packages/manifest.json @@ -5,7 +5,7 @@ "status": "product", "checks": ["tsc", "test"] }, - "ranvi": { + "ranview": { "status": "product", "checks": ["tsc", "test"] }, diff --git a/packages/ranui/README.de.md b/packages/ranui/README.de.md index 38c309111..788258756 100644 --- a/packages/ranui/README.de.md +++ b/packages/ranui/README.de.md @@ -308,7 +308,7 @@ window.message?.success({ ### Reaktive Bausteine -`signal`, `createEffect`, `computed`, `batch`, `untrack` und eine Schicht für Besitzverhältnisse (`createRoot`, `onCleanup`, `getOwner`, `runWithOwner`) kommen zusammen mit dem DOM-Builder – für reaktive Seitenteile ohne Framework. Der Entwurf lehnt sich an SwiftUIs `@Observable` an, mit Zusicherungen nach Art von Solid.js: Effekte räumen vor jedem erneuten Lauf ihre veralteten Abonnements selbst auf; `batch()` fasst mehrere Schreibvorgänge zu einem einzigen Durchlauf zusammen; `computed` ist **träge und merkt sich den Wert** (ein ungelesenes Memo rechnet nie, und es weckt seine Abhängigen erst, wenn sich sein Wert wirklich ändert); und jeder Effekt, jedes Memo und jede Bindung gehört seinem Geltungsbereich, sodass das Verwerfen eines `createRoot` mit einem Aufruf alles abbaut, was darin entstanden ist – die Einheit, mit der eine Seite oder Route abgeräumt wird. Die verkettbaren Methoden von `ElementBuilder` (`text`, `attr`, `class`, …) nehmen zudem einen Signal-Getter an, dann aktualisiert sich die Bindung von selbst. Ausführlich: [`ranvi`](../ranvi/README.md). +`signal`, `createEffect`, `computed`, `batch`, `untrack` und eine Schicht für Besitzverhältnisse (`createRoot`, `onCleanup`, `getOwner`, `runWithOwner`) kommen zusammen mit dem DOM-Builder – für reaktive Seitenteile ohne Framework. Der Entwurf lehnt sich an SwiftUIs `@Observable` an, mit Zusicherungen nach Art von Solid.js: Effekte räumen vor jedem erneuten Lauf ihre veralteten Abonnements selbst auf; `batch()` fasst mehrere Schreibvorgänge zu einem einzigen Durchlauf zusammen; `computed` ist **träge und merkt sich den Wert** (ein ungelesenes Memo rechnet nie, und es weckt seine Abhängigen erst, wenn sich sein Wert wirklich ändert); und jeder Effekt, jedes Memo und jede Bindung gehört seinem Geltungsbereich, sodass das Verwerfen eines `createRoot` mit einem Aufruf alles abbaut, was darin entstanden ist – die Einheit, mit der eine Seite oder Route abgeräumt wird. Die verkettbaren Methoden von `ElementBuilder` (`text`, `attr`, `class`, …) nehmen zudem einen Signal-Getter an, dann aktualisiert sich die Bindung von selbst. Ausführlich: [`ranview`](../ranview/README.md). ```ts import { signal, createEffect, computed, batch, EventManager, Div, ButtonBuilder } from 'ranui/builder'; diff --git a/packages/ranui/README.es.md b/packages/ranui/README.es.md index 7731d210e..f6d416218 100644 --- a/packages/ranui/README.es.md +++ b/packages/ranui/README.es.md @@ -308,7 +308,7 @@ window.message?.success({ ### Piezas reactivas -`signal`, `createEffect`, `computed`, `batch`, `untrack` y una capa de pertenencia (`createRoot`, `onCleanup`, `getOwner`, `runWithOwner`) vienen junto al builder del DOM, para armar trozos de página reactivos sin framework. El diseño se mira en el `@Observable` de SwiftUI con las garantías de Solid.js: los efectos limpian solos las suscripciones viejas antes de volver a correr; `batch()` junta varias escrituras en un único repintado; `computed` es **perezoso y memoriza por valor** (un memo que nadie lee no se calcula nunca, y solo despierta a quienes dependen de él cuando su valor cambia de verdad); y cada efecto, memo y enlace pertenece a su ámbito, de modo que desechar un `createRoot` desmonta de una sola llamada todo lo que nació dentro: la unidad con la que se cierra una página o una ruta. Los encadenables de `ElementBuilder` (`text`, `attr`, `class`, …) aceptan además un getter de señal, y el enlace se actualiza solo. Guía completa: [`ranvi`](../ranvi/README.md). +`signal`, `createEffect`, `computed`, `batch`, `untrack` y una capa de pertenencia (`createRoot`, `onCleanup`, `getOwner`, `runWithOwner`) vienen junto al builder del DOM, para armar trozos de página reactivos sin framework. El diseño se mira en el `@Observable` de SwiftUI con las garantías de Solid.js: los efectos limpian solos las suscripciones viejas antes de volver a correr; `batch()` junta varias escrituras en un único repintado; `computed` es **perezoso y memoriza por valor** (un memo que nadie lee no se calcula nunca, y solo despierta a quienes dependen de él cuando su valor cambia de verdad); y cada efecto, memo y enlace pertenece a su ámbito, de modo que desechar un `createRoot` desmonta de una sola llamada todo lo que nació dentro: la unidad con la que se cierra una página o una ruta. Los encadenables de `ElementBuilder` (`text`, `attr`, `class`, …) aceptan además un getter de señal, y el enlace se actualiza solo. Guía completa: [`ranview`](../ranview/README.md). ```ts import { signal, createEffect, computed, batch, EventManager, Div, ButtonBuilder } from 'ranui/builder'; diff --git a/packages/ranui/README.fa.md b/packages/ranui/README.fa.md index 4bbd3c5bb..8a7c642cf 100644 --- a/packages/ranui/README.fa.md +++ b/packages/ranui/README.fa.md @@ -308,7 +308,7 @@ window.message?.success({ ### قطعه‌های واکنشی -`signal`، `createEffect`، `computed`، `batch`، `untrack` و لایه‌ای برای مالکیت (`createRoot`، `onCleanup`، `getOwner`، `runWithOwner`) در کنار سازندهٔ DOM می‌آیند تا بتوانی بخش‌های واکنشی صفحه را بی‌نیاز از چارچوب بسازی. طرح کار به `@Observable` در SwiftUI می‌ماند، با تضمین‌هایی به سبک Solid.js: اثرها پیش از هر اجرای دوباره، اشتراک‌های کهنهٔ خود را خودکار پاک می‌کنند؛ `batch()` چند نوشتن را در یک بازتاب جمع می‌کند؛ `computed` **تنبل است و بر پایهٔ مقدار به خاطر می‌سپارد** (یادداشتی که کسی نخواندش هرگز محاسبه نمی‌شود و تنها وقتی وابستگانش را بیدار می‌کند که مقدارش واقعاً عوض شده باشد)؛ و هر اثر و یادداشت و اتصال، از آنِ دامنهٔ خودش است، پس دور انداختن یک `createRoot` هرچه را در آن زاده شده با یک فراخوان برمی‌چیند — همان یکایی که با آن یک صفحه یا یک مسیر را جمع می‌کنی. متدهای زنجیره‌پذیر `ElementBuilder` (`text`، `attr`، `class` و…) گیرندهٔ سیگنال را هم می‌پذیرند و اتصال خودبه‌خود به‌روز می‌شود. راهنمای کامل: [`ranvi`](../ranvi/README.md). +`signal`، `createEffect`، `computed`، `batch`، `untrack` و لایه‌ای برای مالکیت (`createRoot`، `onCleanup`، `getOwner`، `runWithOwner`) در کنار سازندهٔ DOM می‌آیند تا بتوانی بخش‌های واکنشی صفحه را بی‌نیاز از چارچوب بسازی. طرح کار به `@Observable` در SwiftUI می‌ماند، با تضمین‌هایی به سبک Solid.js: اثرها پیش از هر اجرای دوباره، اشتراک‌های کهنهٔ خود را خودکار پاک می‌کنند؛ `batch()` چند نوشتن را در یک بازتاب جمع می‌کند؛ `computed` **تنبل است و بر پایهٔ مقدار به خاطر می‌سپارد** (یادداشتی که کسی نخواندش هرگز محاسبه نمی‌شود و تنها وقتی وابستگانش را بیدار می‌کند که مقدارش واقعاً عوض شده باشد)؛ و هر اثر و یادداشت و اتصال، از آنِ دامنهٔ خودش است، پس دور انداختن یک `createRoot` هرچه را در آن زاده شده با یک فراخوان برمی‌چیند — همان یکایی که با آن یک صفحه یا یک مسیر را جمع می‌کنی. متدهای زنجیره‌پذیر `ElementBuilder` (`text`، `attr`، `class` و…) گیرندهٔ سیگنال را هم می‌پذیرند و اتصال خودبه‌خود به‌روز می‌شود. راهنمای کامل: [`ranview`](../ranview/README.md). ```ts import { signal, createEffect, computed, batch, EventManager, Div, ButtonBuilder } from 'ranui/builder'; diff --git a/packages/ranui/README.ja.md b/packages/ranui/README.ja.md index edf9a5d1d..9e8e54976 100644 --- a/packages/ranui/README.ja.md +++ b/packages/ranui/README.ja.md @@ -308,7 +308,7 @@ window.message?.success({ ### リアクティビティの部品 -`signal`、`createEffect`、`computed`、`batch`、`untrack`、それに所有関係の層(`createRoot` / `onCleanup` / `getOwner` / `runWithOwner`)が、DOM の builder と並んで入っています。フレームワークなしで、反応する画面の一部を組み立てるためのものです。設計は SwiftUI の `@Observable` になぞらえつつ、Solid.js 流の保証を備えています。エフェクトは再実行のたびに古い購読を自動で片づけます。`batch()` は複数の書き込みをひとつの反映にまとめます。`computed` は**遅延評価かつ値でメモ化**されます(誰にも読まれないメモは一度も計算されず、値が実際に変わったときだけ依存する側を起こします)。そしてエフェクト・メモ・バインディングはすべてスコープが持ち主なので、`createRoot` を破棄すれば、そこから生まれたものが一度の呼び出しでまとめて片づきます。ページやルートを畳む単位がこれです。`ElementBuilder` のチェーンできるメソッド(`text` / `attr` / `class` など)はシグナルのゲッターも受けつけ、自動で更新されるバインディングになります。詳しくは [`ranvi`](../ranvi/README.md) を。 +`signal`、`createEffect`、`computed`、`batch`、`untrack`、それに所有関係の層(`createRoot` / `onCleanup` / `getOwner` / `runWithOwner`)が、DOM の builder と並んで入っています。フレームワークなしで、反応する画面の一部を組み立てるためのものです。設計は SwiftUI の `@Observable` になぞらえつつ、Solid.js 流の保証を備えています。エフェクトは再実行のたびに古い購読を自動で片づけます。`batch()` は複数の書き込みをひとつの反映にまとめます。`computed` は**遅延評価かつ値でメモ化**されます(誰にも読まれないメモは一度も計算されず、値が実際に変わったときだけ依存する側を起こします)。そしてエフェクト・メモ・バインディングはすべてスコープが持ち主なので、`createRoot` を破棄すれば、そこから生まれたものが一度の呼び出しでまとめて片づきます。ページやルートを畳む単位がこれです。`ElementBuilder` のチェーンできるメソッド(`text` / `attr` / `class` など)はシグナルのゲッターも受けつけ、自動で更新されるバインディングになります。詳しくは [`ranview`](../ranview/README.md) を。 ```ts import { signal, createEffect, computed, batch, EventManager, Div, ButtonBuilder } from 'ranui/builder'; diff --git a/packages/ranui/README.ko.md b/packages/ranui/README.ko.md index 41d350275..7a3e971a1 100644 --- a/packages/ranui/README.ko.md +++ b/packages/ranui/README.ko.md @@ -308,7 +308,7 @@ window.message?.success({ ### 반응형 부품 -`signal`, `createEffect`, `computed`, `batch`, `untrack`과 소유 계층(`createRoot`, `onCleanup`, `getOwner`, `runWithOwner`)이 DOM builder와 나란히 들어 있습니다. 프레임워크 없이 반응하는 화면 조각을 짜기 위한 것입니다. 설계는 SwiftUI의 `@Observable`을 본뜨되 Solid.js식 보장을 갖췄습니다. 이펙트는 다시 돌기 전에 낡은 구독을 알아서 치웁니다. `batch()`는 여러 쓰기를 한 번의 반영으로 모읍니다. `computed`는 **게으르고 값으로 메모**됩니다(아무도 읽지 않는 메모는 한 번도 계산되지 않고, 값이 실제로 달라졌을 때만 딸린 것들을 깨웁니다). 그리고 이펙트와 메모, 바인딩은 모두 자기 범위가 주인이라, `createRoot` 하나를 버리면 거기서 태어난 것이 한 번의 호출로 전부 걷힙니다. 페이지나 라우트를 접는 단위가 바로 이것입니다. `ElementBuilder`의 체이닝 메서드(`text`, `attr`, `class` 등)는 시그널 게터도 받아, 알아서 갱신되는 바인딩이 됩니다. 자세한 안내: [`ranvi`](../ranvi/README.md). +`signal`, `createEffect`, `computed`, `batch`, `untrack`과 소유 계층(`createRoot`, `onCleanup`, `getOwner`, `runWithOwner`)이 DOM builder와 나란히 들어 있습니다. 프레임워크 없이 반응하는 화면 조각을 짜기 위한 것입니다. 설계는 SwiftUI의 `@Observable`을 본뜨되 Solid.js식 보장을 갖췄습니다. 이펙트는 다시 돌기 전에 낡은 구독을 알아서 치웁니다. `batch()`는 여러 쓰기를 한 번의 반영으로 모읍니다. `computed`는 **게으르고 값으로 메모**됩니다(아무도 읽지 않는 메모는 한 번도 계산되지 않고, 값이 실제로 달라졌을 때만 딸린 것들을 깨웁니다). 그리고 이펙트와 메모, 바인딩은 모두 자기 범위가 주인이라, `createRoot` 하나를 버리면 거기서 태어난 것이 한 번의 호출로 전부 걷힙니다. 페이지나 라우트를 접는 단위가 바로 이것입니다. `ElementBuilder`의 체이닝 메서드(`text`, `attr`, `class` 등)는 시그널 게터도 받아, 알아서 갱신되는 바인딩이 됩니다. 자세한 안내: [`ranview`](../ranview/README.md). ```ts import { signal, createEffect, computed, batch, EventManager, Div, ButtonBuilder } from 'ranui/builder'; diff --git a/packages/ranui/README.md b/packages/ranui/README.md index 550c3f767..c908dcbc4 100644 --- a/packages/ranui/README.md +++ b/packages/ranui/README.md @@ -318,7 +318,7 @@ window.message?.success({ ### Reactive Primitives -`signal`, `createEffect`, `computed`, `batch`, `untrack`, and an ownership layer (`createRoot` / `onCleanup` / `getOwner` / `runWithOwner`) ship alongside the DOM builder for building reactive page sections without a framework. The design mirrors SwiftUI's `@Observable` with Solid.js-style guarantees: effects auto-clean stale subscriptions before each re-run; `batch()` coalesces writes into one flush; `computed` is **lazy + value-memoized** (an unread memo never computes, and it wakes dependents only when its value actually changes); and every effect/memo/binding is owned by its scope, so disposing a `createRoot` tears down everything it spawned in one call — the teardown unit for a page/route. `ElementBuilder` chainables (`text`/`attr`/`class`/…) also accept a signal getter for auto-updating bindings. Full guide: [`ranvi`](../ranvi/README.md). +`signal`, `createEffect`, `computed`, `batch`, `untrack`, and an ownership layer (`createRoot` / `onCleanup` / `getOwner` / `runWithOwner`) ship alongside the DOM builder for building reactive page sections without a framework. The design mirrors SwiftUI's `@Observable` with Solid.js-style guarantees: effects auto-clean stale subscriptions before each re-run; `batch()` coalesces writes into one flush; `computed` is **lazy + value-memoized** (an unread memo never computes, and it wakes dependents only when its value actually changes); and every effect/memo/binding is owned by its scope, so disposing a `createRoot` tears down everything it spawned in one call — the teardown unit for a page/route. `ElementBuilder` chainables (`text`/`attr`/`class`/…) also accept a signal getter for auto-updating bindings. Full guide: [`ranview`](../ranview/README.md). ```ts import { signal, createEffect, computed, batch, EventManager, Div, ButtonBuilder } from 'ranui/builder'; diff --git a/packages/ranui/README.pt.md b/packages/ranui/README.pt.md index efb2d9a4f..4623f8995 100644 --- a/packages/ranui/README.pt.md +++ b/packages/ranui/README.pt.md @@ -308,7 +308,7 @@ O `getContainer` precisa devolver um `HTMLElement`; se for omitido, as mensagens ### Peças reativas -`signal`, `createEffect`, `computed`, `batch`, `untrack` e uma camada de posse (`createRoot`, `onCleanup`, `getOwner`, `runWithOwner`) vêm ao lado do builder do DOM, para montar pedaços reativos de página sem framework. O desenho se espelha no `@Observable` do SwiftUI com as garantias do Solid.js: os efeitos limpam sozinhos as inscrições velhas antes de rodar de novo; o `batch()` junta várias escritas num único repinte; o `computed` é **preguiçoso e memoriza por valor** (um memo que ninguém lê nunca é calculado, e ele só acorda quem depende dele quando o valor muda de verdade); e cada efeito, memo e ligação pertence ao seu escopo, de modo que descartar um `createRoot` desmonta numa só chamada tudo o que nasceu dentro dele: a unidade com que se fecha uma página ou uma rota. Os encadeáveis do `ElementBuilder` (`text`, `attr`, `class`, …) também aceitam um getter de sinal, e a ligação se atualiza sozinha. Guia completo: [`ranvi`](../ranvi/README.md). +`signal`, `createEffect`, `computed`, `batch`, `untrack` e uma camada de posse (`createRoot`, `onCleanup`, `getOwner`, `runWithOwner`) vêm ao lado do builder do DOM, para montar pedaços reativos de página sem framework. O desenho se espelha no `@Observable` do SwiftUI com as garantias do Solid.js: os efeitos limpam sozinhos as inscrições velhas antes de rodar de novo; o `batch()` junta várias escritas num único repinte; o `computed` é **preguiçoso e memoriza por valor** (um memo que ninguém lê nunca é calculado, e ele só acorda quem depende dele quando o valor muda de verdade); e cada efeito, memo e ligação pertence ao seu escopo, de modo que descartar um `createRoot` desmonta numa só chamada tudo o que nasceu dentro dele: a unidade com que se fecha uma página ou uma rota. Os encadeáveis do `ElementBuilder` (`text`, `attr`, `class`, …) também aceitam um getter de sinal, e a ligação se atualiza sozinha. Guia completo: [`ranview`](../ranview/README.md). ```ts import { signal, createEffect, computed, batch, EventManager, Div, ButtonBuilder } from 'ranui/builder'; diff --git a/packages/ranui/README.zh-CN.md b/packages/ranui/README.zh-CN.md index 477850112..ea2676e85 100644 --- a/packages/ranui/README.zh-CN.md +++ b/packages/ranui/README.zh-CN.md @@ -284,7 +284,7 @@ window.message?.success({ ### 响应式原语 -`signal`、`createEffect`、`computed`、`batch`、`untrack` 以及所有权层(`createRoot` / `onCleanup` / `getOwner` / `runWithOwner`)与 DOM builder 一起提供,用于在无框架依赖的情况下构建响应式页面区块。设计参考 SwiftUI 的 `@Observable`,并采用 Solid.js 风格的保证:effect 重新执行前自动清理过期订阅;`batch()` 将多次写入合并为一次 flush;`computed` 是**惰性 + 按值记忆化**的(未被读取的 memo 从不计算,且仅当值真正改变时才唤醒依赖);每个 effect/memo/绑定都归其作用域所有,销毁一个 `createRoot` 即可一次性拆除其派生的一切 —— 这是页面/路由的销毁单元。`ElementBuilder` 链式方法(`text`/`attr`/`class`/…)也接受 signal getter 作为自动更新的绑定。完整指南见 [`ranvi`](../ranvi/README.md)。 +`signal`、`createEffect`、`computed`、`batch`、`untrack` 以及所有权层(`createRoot` / `onCleanup` / `getOwner` / `runWithOwner`)与 DOM builder 一起提供,用于在无框架依赖的情况下构建响应式页面区块。设计参考 SwiftUI 的 `@Observable`,并采用 Solid.js 风格的保证:effect 重新执行前自动清理过期订阅;`batch()` 将多次写入合并为一次 flush;`computed` 是**惰性 + 按值记忆化**的(未被读取的 memo 从不计算,且仅当值真正改变时才唤醒依赖);每个 effect/memo/绑定都归其作用域所有,销毁一个 `createRoot` 即可一次性拆除其派生的一切 —— 这是页面/路由的销毁单元。`ElementBuilder` 链式方法(`text`/`attr`/`class`/…)也接受 signal getter 作为自动更新的绑定。完整指南见 [`ranview`](../ranview/README.md)。 ```ts import { signal, createEffect, computed, batch, EventManager, Div, ButtonBuilder } from 'ranui/builder'; diff --git a/packages/ranui/builder.ts b/packages/ranui/builder.ts index 7c2032584..dda30bb22 100644 --- a/packages/ranui/builder.ts +++ b/packages/ranui/builder.ts @@ -1,22 +1,22 @@ /** * The `ranui/builder` entry point. * - * The implementation moved to its own package, `ranvi`; this file keeps the same export + * The implementation moved to its own package, `ranview`; this file keeps the same export * list so the public surface of `ranui/builder` is unchanged down to the name. Every * name is written out rather than forwarded wholesale: a star re-export would also carry - * whatever ranvi adds next, quietly widening ranui's public API. `package-exports.source` + * whatever ranview adds next, quietly widening ranui's public API. `package-exports.source` * enforces that, by looking for the star token in this file's text — which is why this * sentence does not spell it. */ -export { isSSR } from 'ranvi'; -export { EventManager } from 'ranvi'; -export { signal, createEffect, computed, batch, untrack, createRoot, onCleanup, getOwner, runWithOwner } from 'ranvi'; -export type { Getter, Setter, SignalOptions, Owner } from 'ranvi'; -export { escapeHtml, escapeHtmlAttribute } from 'ranvi'; -export { matchSelector, collectMatches } from 'ranvi'; -export type { MockNode } from 'ranvi'; -export { DocumentFragmentMock, HTMLElementMock, ShadowRootMock } from 'ranvi'; -export { createRef, For, Index, Show, Switch, Match, ElementBuilder, ShadowBuilder } from 'ranvi'; +export { isSSR } from 'ranview'; +export { EventManager } from 'ranview'; +export { signal, createEffect, computed, batch, untrack, createRoot, onCleanup, getOwner, runWithOwner } from 'ranview'; +export type { Getter, Setter, SignalOptions, Owner } from 'ranview'; +export { escapeHtml, escapeHtmlAttribute } from 'ranview'; +export { matchSelector, collectMatches } from 'ranview'; +export type { MockNode } from 'ranview'; +export { DocumentFragmentMock, HTMLElementMock, ShadowRootMock } from 'ranview'; +export { createRef, For, Index, Show, Switch, Match, ElementBuilder, ShadowBuilder } from 'ranview'; export type { Ref, Child, @@ -27,7 +27,7 @@ export type { ShowOptions, SwitchOptions, MatchClause, -} from 'ranvi'; +} from 'ranview'; export { View, Div, @@ -46,4 +46,4 @@ export { Footer, Main, DeclarativeShadow, -} from 'ranvi'; +} from 'ranview'; diff --git a/packages/ranui/docs/SSR_DESIGN.md b/packages/ranui/docs/SSR_DESIGN.md index 55a927a8f..c03204cf1 100644 --- a/packages/ranui/docs/SSR_DESIGN.md +++ b/packages/ranui/docs/SSR_DESIGN.md @@ -19,7 +19,7 @@ ### `ShadowRootMock.querySelector` 查询范围错误 -**位置**:[ranvi src/mocks.ts:227](../../ranvi/src/mocks.ts#L227) +**位置**:[ranview src/mocks.ts:227](../../ranview/src/mocks.ts#L227) ```typescript // 当前实现:查询宿主的 childrenList,而不是 shadow root 自身的 childrenList diff --git a/packages/ranui/package.json b/packages/ranui/package.json index fb02ca251..2064ad763 100644 --- a/packages/ranui/package.json +++ b/packages/ranui/package.json @@ -480,7 +480,7 @@ "mermaid": "11.16.1", "mpegts.js": "1.8.1", "ranuts": "workspace:*", - "ranvi": "workspace:*", + "ranview": "workspace:*", "remend": "1.3.0", "shiki": "4.4.3", "temml": "0.13.4" diff --git a/packages/ranui/utils/README.md b/packages/ranui/utils/README.md index 3a64d0a54..31cd2109e 100644 --- a/packages/ranui/utils/README.md +++ b/packages/ranui/utils/README.md @@ -215,7 +215,7 @@ const actions = Div() ## Reactive Primitives (`builder/signal.ts`) -Fine-grained reactivity inspired by SwiftUI's `@Observable` and Solid.js signals. Reading a signal inside `createEffect` or `computed` automatically establishes a dependency — no manual subscription needed. See [`ranvi`](../../ranvi/README.md) for the full guide (ownership, reactive `ElementBuilder` bindings, MPA/SPA teardown). +Fine-grained reactivity inspired by SwiftUI's `@Observable` and Solid.js signals. Reading a signal inside `createEffect` or `computed` automatically establishes a dependency — no manual subscription needed. See [`ranview`](../../ranview/README.md) for the full guide (ownership, reactive `ElementBuilder` bindings, MPA/SPA teardown). ```ts import { diff --git a/packages/ranui/utils/README.zh-CN.md b/packages/ranui/utils/README.zh-CN.md index 29a305ebd..8bd501230 100644 --- a/packages/ranui/utils/README.zh-CN.md +++ b/packages/ranui/utils/README.zh-CN.md @@ -215,7 +215,7 @@ const actions = Div() ## 响应式原语 (`builder/signal.ts`) -细粒度响应式,设计参考 SwiftUI `@Observable` 和 Solid.js signals。在 `createEffect` 或 `computed` 中读取 signal 会自动建立依赖关系,无需手动订阅。完整指南(所有权、`ElementBuilder` 响应式绑定、MPA/SPA 销毁)见 [`ranvi`](../../ranvi/README.md)。 +细粒度响应式,设计参考 SwiftUI `@Observable` 和 Solid.js signals。在 `createEffect` 或 `computed` 中读取 signal 会自动建立依赖关系,无需手动订阅。完整指南(所有权、`ElementBuilder` 响应式绑定、MPA/SPA 销毁)见 [`ranview`](../../ranview/README.md)。 ```ts import { diff --git a/packages/ranui/utils/builder/index.ts b/packages/ranui/utils/builder/index.ts index 439da030f..c6eaa70d6 100644 --- a/packages/ranui/utils/builder/index.ts +++ b/packages/ranui/utils/builder/index.ts @@ -1,5 +1,5 @@ /** - * The builder now lives in its own package, `ranvi`. + * The builder now lives in its own package, `ranview`. * * This file stays as a re-export so nothing in ranui had to change: 84 modules import * `@/utils/builder`, and `ranui/builder` is a published entry point that consumers use. @@ -11,4 +11,4 @@ * ranui, and with it a video player, a diagram renderer and a maths typesetter: 242 MB of * transitive dependencies for a file that depends on one function. */ -export * from 'ranvi'; +export * from 'ranview'; diff --git a/packages/ranui/utils/component.ts b/packages/ranui/utils/component.ts index 9b8b5e107..7d3ee4be8 100644 --- a/packages/ranui/utils/component.ts +++ b/packages/ranui/utils/component.ts @@ -1,5 +1,5 @@ import { adoptSheetText, adoptStyles } from './style'; -import type { Ref } from 'ranvi'; +import type { Ref } from 'ranview'; const shadowRootCache = new WeakMap(); diff --git a/packages/ranui/utils/index.ts b/packages/ranui/utils/index.ts index cf213dcc2..ea62befeb 100644 --- a/packages/ranui/utils/index.ts +++ b/packages/ranui/utils/index.ts @@ -11,7 +11,7 @@ export { // load 事件);这里继续导出同名符号,ranui 的对外 API 不变。 export { loadScript } from 'ranuts/utils'; export * from './error'; -export { signal, createEffect, computed, batch } from 'ranvi'; +export { signal, createEffect, computed, batch } from 'ranview'; export * from './ssr'; export * from './video'; export * from './component'; diff --git a/packages/ranui/utils/ssr-registry.ts b/packages/ranui/utils/ssr-registry.ts index 1209b01e3..75734bb56 100644 --- a/packages/ranui/utils/ssr-registry.ts +++ b/packages/ranui/utils/ssr-registry.ts @@ -1,4 +1,4 @@ -import { isSSR } from 'ranvi'; +import { isSSR } from 'ranview'; const registry = new Map HTMLElement>(); diff --git a/packages/ranvi/README.md b/packages/ranview/README.md similarity index 98% rename from packages/ranvi/README.md rename to packages/ranview/README.md index e57d32657..ed0642556 100644 --- a/packages/ranvi/README.md +++ b/packages/ranview/README.md @@ -1,4 +1,4 @@ -# ranvi — fluent DOM + fine-grained reactivity +# ranview — fluent DOM + fine-grained reactivity A framework-free way to build DOM declaratively, with SwiftUI/Solid-style fine-grained reactivity. No virtual DOM, no re-render of a whole tree — a signal change updates only @@ -13,7 +13,7 @@ require you to install a video player, a diagram renderer and a maths typesetter it. `ranui/builder` still re-exports everything here, unchanged. ```sh -npm i ranvi +npm i ranview ``` > **Principle: build once, update in place.** A view function runs once; state @@ -39,7 +39,7 @@ import { getOwner, runWithOwner, // ownership EventManager, // lifecycle-scoped events -} from 'ranvi'; +} from 'ranview'; ``` The builder does **not** register custom elements. To use `` etc., @@ -143,7 +143,7 @@ class** (each component exports it) — then its methods are typed, no cast: ```ts import { Popover } from 'ranui'; // the element class -import { View, createRef } from 'ranvi'; +import { View, createRef } from 'ranview'; const ref = createRef(); View('r-popover').attr('trigger', 'click').ref(ref).children(/* … */).build(); @@ -228,7 +228,7 @@ branch updates through its own bindings — the branch is built once. (A raw get child, by contrast, tears down and rebuilds on every dependency tick.) ```ts -import { Show } from 'ranvi'; +import { Show } from 'ranview'; Div().children( Show({ @@ -266,7 +266,7 @@ winning branch is memoized, so it rebuilds only when the active branch changes. Evaluation short-circuits at the first match. ```ts -import { Switch, Match } from 'ranvi'; +import { Switch, Match } from 'ranview'; Div().children( Switch({ @@ -299,7 +299,7 @@ values and transitions inside surviving rows are preserved (a plain getter child would rebuild all of them). Pass the handle straight to `children()`. ```ts -import { For } from 'ranvi'; +import { For } from 'ranview'; const [rows, setRows] = signal([{ id: 1, title: 'a' }]); @@ -335,7 +335,7 @@ move. Use it when position is the identity (primitive arrays, fixed rows); use `For` when items have a stable id and can reorder. ```ts -import { Index } from 'ranvi'; +import { Index } from 'ranview'; Ul().children( Index({ @@ -364,7 +364,7 @@ created it. Disposing a scope disposes everything under it — nested effects, bindings, and `onCleanup` callbacks. ```ts -import { createRoot, onCleanup } from 'ranvi'; +import { createRoot, onCleanup } from 'ranview'; const dispose = createRoot((dispose) => { const el = Div().text(msg).build(); // this binding is owned by the root diff --git a/packages/ranvi/package.json b/packages/ranview/package.json similarity index 98% rename from packages/ranvi/package.json rename to packages/ranview/package.json index fe339c1c4..96be8cc76 100644 --- a/packages/ranvi/package.json +++ b/packages/ranview/package.json @@ -1,5 +1,5 @@ { - "name": "ranvi", + "name": "ranview", "version": "0.1.0-alpha.0", "description": "Framework-free DOM construction with fine-grained reactivity \u2014 build once, update in place, in a browser or to a string", "type": "module", diff --git a/packages/ranvi/src/core.ts b/packages/ranview/src/core.ts similarity index 99% rename from packages/ranvi/src/core.ts rename to packages/ranview/src/core.ts index 4da12b2f5..4187f3326 100644 --- a/packages/ranvi/src/core.ts +++ b/packages/ranview/src/core.ts @@ -269,7 +269,9 @@ const mountKeyedList = (parent: Node, spec: ForSpec): void => { // duplicate — deterministic and leak-free — and warn in dev. if (next.has(k)) { if (isDev()) { - console.error(`[ranvi For] duplicate key "${String(k)}" — keys must be unique; ignoring the duplicate item.`); + console.error( + `[ranview For] duplicate key "${String(k)}" — keys must be unique; ignoring the duplicate item.`, + ); } return; } diff --git a/packages/ranvi/src/env.ts b/packages/ranview/src/env.ts similarity index 100% rename from packages/ranvi/src/env.ts rename to packages/ranview/src/env.ts diff --git a/packages/ranvi/src/escape.ts b/packages/ranview/src/escape.ts similarity index 95% rename from packages/ranvi/src/escape.ts rename to packages/ranview/src/escape.ts index 67bf90c90..55c7d4dc6 100644 --- a/packages/ranvi/src/escape.ts +++ b/packages/ranview/src/escape.ts @@ -1,5 +1,5 @@ // HTML 转义。实现住在 ranuts —— 它先用一个正则探测有没有特殊字符,没有就原样返回, -// 省掉了「无论如何都跑五次 replace」的分配开销;ranvi 这边只保留导出名。 +// 省掉了「无论如何都跑五次 replace」的分配开销;ranview 这边只保留导出名。 // // 一处可见差异:单引号现在转义成 `'` 而不是 `'`。两者是同一个字符的 // 等价实体,渲染结果相同,但 SSR 序列化出来的 HTML 字节会变,比对快照时会看到。 diff --git a/packages/ranvi/src/events.ts b/packages/ranview/src/events.ts similarity index 100% rename from packages/ranvi/src/events.ts rename to packages/ranview/src/events.ts diff --git a/packages/ranvi/src/factory.ts b/packages/ranview/src/factory.ts similarity index 100% rename from packages/ranvi/src/factory.ts rename to packages/ranview/src/factory.ts diff --git a/packages/ranvi/src/index.ts b/packages/ranview/src/index.ts similarity index 100% rename from packages/ranvi/src/index.ts rename to packages/ranview/src/index.ts diff --git a/packages/ranvi/src/mocks.ts b/packages/ranview/src/mocks.ts similarity index 100% rename from packages/ranvi/src/mocks.ts rename to packages/ranview/src/mocks.ts diff --git a/packages/ranvi/src/selectors.ts b/packages/ranview/src/selectors.ts similarity index 100% rename from packages/ranvi/src/selectors.ts rename to packages/ranview/src/selectors.ts diff --git a/packages/ranvi/src/signal.ts b/packages/ranview/src/signal.ts similarity index 99% rename from packages/ranvi/src/signal.ts rename to packages/ranview/src/signal.ts index 2747c48dd..665677555 100644 --- a/packages/ranvi/src/signal.ts +++ b/packages/ranview/src/signal.ts @@ -329,7 +329,7 @@ function updateIfNecessary(node: Computation): void { function runComputation(node: Computation): void { if (node.running) { - throw new Error('ranvi reactivity: cyclic dependency detected (a computation triggered itself).'); + throw new Error('ranview reactivity: cyclic dependency detected (a computation triggered itself).'); } cleanNode(node); diff --git a/packages/ranvi/test/builder.core.browser.test.ts b/packages/ranview/test/builder.core.browser.test.ts similarity index 100% rename from packages/ranvi/test/builder.core.browser.test.ts rename to packages/ranview/test/builder.core.browser.test.ts diff --git a/packages/ranvi/test/builder.core.ssr.test.ts b/packages/ranview/test/builder.core.ssr.test.ts similarity index 100% rename from packages/ranvi/test/builder.core.ssr.test.ts rename to packages/ranview/test/builder.core.ssr.test.ts diff --git a/packages/ranvi/test/builder.escape.test.ts b/packages/ranview/test/builder.escape.test.ts similarity index 100% rename from packages/ranvi/test/builder.escape.test.ts rename to packages/ranview/test/builder.escape.test.ts diff --git a/packages/ranvi/test/builder.factory.ssr.test.ts b/packages/ranview/test/builder.factory.ssr.test.ts similarity index 100% rename from packages/ranvi/test/builder.factory.ssr.test.ts rename to packages/ranview/test/builder.factory.ssr.test.ts diff --git a/packages/ranvi/test/builder.mocks.test.ts b/packages/ranview/test/builder.mocks.test.ts similarity index 100% rename from packages/ranvi/test/builder.mocks.test.ts rename to packages/ranview/test/builder.mocks.test.ts diff --git a/packages/ranvi/test/builder.selectors.test.ts b/packages/ranview/test/builder.selectors.test.ts similarity index 100% rename from packages/ranvi/test/builder.selectors.test.ts rename to packages/ranview/test/builder.selectors.test.ts diff --git a/packages/ranvi/test/event-manager.test.ts b/packages/ranview/test/event-manager.test.ts similarity index 100% rename from packages/ranvi/test/event-manager.test.ts rename to packages/ranview/test/event-manager.test.ts diff --git a/packages/ranvi/test/readme.test.ts b/packages/ranview/test/readme.test.ts similarity index 82% rename from packages/ranvi/test/readme.test.ts rename to packages/ranview/test/readme.test.ts index 67ee4a65c..9a0312235 100644 --- a/packages/ranvi/test/readme.test.ts +++ b/packages/ranview/test/readme.test.ts @@ -2,7 +2,7 @@ * Every name the README says you can import has to actually be exported. * * The README arrived here as ranui's `BUILDER.md` and its import lines were rewritten - * from `ranui/builder` to `ranvi` mechanically. A rewrite like that cannot introduce a + * from `ranui/builder` to `ranview` mechanically. A rewrite like that cannot introduce a * wrong *path*, but nothing was checking the *names* — and a manual that tells a reader * to import something that does not exist is worse than no manual, because they will * assume they are holding it wrong. @@ -11,14 +11,14 @@ import { readFileSync } from 'node:fs'; import { dirname, resolve } from 'node:path'; import { fileURLToPath } from 'node:url'; import { describe, expect, it } from 'vitest'; -import * as ranvi from '../src/index.ts'; +import * as ranview from '../src/index.ts'; const readme = readFileSync(resolve(dirname(fileURLToPath(import.meta.url)), '../README.md'), 'utf8'); -/** `import { a, b } from 'ranvi'` → ['a', 'b'], comments and type-only names removed. */ +/** `import { a, b } from 'ranview'` → ['a', 'b'], comments and type-only names removed. */ const importedNames = (): string[] => { const names = new Set(); - for (const block of readme.matchAll(/import\s*\{([^}]*)\}\s*from\s*'ranvi'/g)) { + for (const block of readme.matchAll(/import\s*\{([^}]*)\}\s*from\s*'ranview'/g)) { for (const raw of block[1].split(',')) { const name = raw .replace(/\/\/.*$/gm, '') @@ -42,6 +42,6 @@ describe('README', () => { // Types vanish at runtime, so a missing name is only a failure if it is not one. const isType = new RegExp(`import\\s+type[^}]*\\b${name}\\b|\\btype\\s+${name}\\b`).test(readme); if (isType) return; - expect(Object.hasOwn(ranvi, name), `README imports { ${name} } from 'ranvi'`).toBe(true); + expect(Object.hasOwn(ranview, name), `README imports { ${name} } from 'ranview'`).toBe(true); }); }); diff --git a/packages/ranvi/test/utils.signal.owner.test.ts b/packages/ranview/test/utils.signal.owner.test.ts similarity index 100% rename from packages/ranvi/test/utils.signal.owner.test.ts rename to packages/ranview/test/utils.signal.owner.test.ts diff --git a/packages/ranvi/test/utils.signal.test.ts b/packages/ranview/test/utils.signal.test.ts similarity index 100% rename from packages/ranvi/test/utils.signal.test.ts rename to packages/ranview/test/utils.signal.test.ts diff --git a/packages/ranvi/tsconfig.build.json b/packages/ranview/tsconfig.build.json similarity index 100% rename from packages/ranvi/tsconfig.build.json rename to packages/ranview/tsconfig.build.json diff --git a/packages/ranvi/tsconfig.json b/packages/ranview/tsconfig.json similarity index 100% rename from packages/ranvi/tsconfig.json rename to packages/ranview/tsconfig.json diff --git a/packages/ranvi/vite.config.ts b/packages/ranview/vite.config.ts similarity index 100% rename from packages/ranvi/vite.config.ts rename to packages/ranview/vite.config.ts diff --git a/packages/ranvi/vitest.config.ts b/packages/ranview/vitest.config.ts similarity index 100% rename from packages/ranvi/vitest.config.ts rename to packages/ranview/vitest.config.ts diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a388c3f8a..51d98acb9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -247,9 +247,9 @@ importers: ranuts: specifier: workspace:* version: link:../ranuts - ranvi: + ranview: specifier: workspace:* - version: link:../ranvi + version: link:../ranview remend: specifier: 1.3.0 version: 1.3.0 @@ -328,7 +328,7 @@ importers: specifier: 'catalog:' version: 4.1.11(@types/node@26.1.2)(@vitest/coverage-v8@4.1.11)(jsdom@29.1.1)(vite@8.2.1(@types/node@26.1.2)(esbuild@0.28.1)(less@4.8.1)(terser@5.49.2)(tsx@4.23.10)) - packages/ranvi: + packages/ranview: dependencies: ranuts: specifier: workspace:*