rip-lang 3.10.15 → 3.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,4 +1,4 @@
1
- <p><img src="docs/rip.svg" alt="Rip Logo" width="100"></p>
1
+ <img src="https://raw.githubusercontent.com/shreeve/rip-lang/main/docs/assets/rip.png" style="width:50px" /> <br>
2
2
 
3
3
  # Changelog
4
4
 
package/README.md CHANGED
@@ -1,5 +1,5 @@
1
1
  <p align="center">
2
- <img src="docs/rip-1280w.png" alt="Rip Logo" width="400">
2
+ <img src="docs/assets/rip-1280w.png" alt="Rip Logo" width="400">
3
3
  </p>
4
4
 
5
5
  <h1 align="center">Rip</h1>
@@ -9,7 +9,7 @@
9
9
  </p>
10
10
 
11
11
  <p align="center">
12
- <a href="CHANGELOG.md"><img src="https://img.shields.io/badge/version-3.10.15-blue.svg" alt="Version"></a>
12
+ <a href="CHANGELOG.md"><img src="https://img.shields.io/badge/version-3.12.1-blue.svg" alt="Version"></a>
13
13
  <a href="#zero-dependencies"><img src="https://img.shields.io/badge/dependencies-ZERO-brightgreen.svg" alt="Dependencies"></a>
14
14
  <a href="#"><img src="https://img.shields.io/badge/tests-1%2C243%2F1%2C243-brightgreen.svg" alt="Tests"></a>
15
15
  <a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-green.svg" alt="License"></a>
@@ -280,7 +280,7 @@ export Home = component
280
280
 
281
281
  That's it. The runtime auto-detects inline `data-name` components, compiles them, and launches the app with hash routing — no bootstrap script needed. Two keywords (`component` and `render`) are all the language adds. Everything else (`:=` state, `~=` computed, methods, lifecycle) is standard Rip.
282
282
 
283
- See [@rip-lang/ui](packages/ui/) for the full framework: file-based router, reactive stash, component store, and renderer. **[Try the demo](https://shreeve.github.io/rip-lang/demo.html)** — a complete app in one HTML file.
283
+ The UI framework is built into rip-lang: file-based router, reactive stash, component store, and renderer. **[Try the demo](https://shreeve.github.io/rip-lang/demo.html)** — a complete app in one HTML file.
284
284
 
285
285
  ---
286
286
 
@@ -361,7 +361,7 @@ Rip includes optional packages for full-stack development:
361
361
  | [@rip-lang/api](packages/api/) | 1.1.10 | HTTP framework (Sinatra-style routing, 37 validators) |
362
362
  | [@rip-lang/server](packages/server/) | 1.1.19 | Multi-worker app server (hot reload, HTTPS, mDNS) |
363
363
  | [@rip-lang/db](packages/db/) | 1.2.0 | DuckDB server with official UI + ActiveRecord-style client |
364
- | [@rip-lang/ui](packages/ui/) | 0.3.19 | Zero-build reactive web framework (auto-launch, stash, router) |
364
+ | [@rip-lang/grid](packages/grid/) | 0.2.0 | Reactive data grid |
365
365
  | [@rip-lang/swarm](packages/swarm/) | 1.1.4 | Parallel job runner with worker pool |
366
366
  | [@rip-lang/csv](packages/csv/) | 1.1.4 | CSV parser + writer |
367
367
  | [@rip-lang/schema](packages/schema/) | 0.2.1 | Unified schema → TypeScript types, SQL DDL, validation, ORM |
@@ -1,4 +1,4 @@
1
- <img src="https://raw.githubusercontent.com/shreeve/rip-lang/main/docs/rip.png" style="width:50px" /> <br>
1
+ <img src="https://raw.githubusercontent.com/shreeve/rip-lang/main/docs/assets/rip.png" style="width:50px" /> <br>
2
2
 
3
3
  # Rip Internals
4
4
 
package/docs/RIP-LANG.md CHANGED
@@ -1,4 +1,4 @@
1
- <img src="https://raw.githubusercontent.com/shreeve/rip-lang/main/docs/rip.png" style="width:50px" /> <br>
1
+ <img src="https://raw.githubusercontent.com/shreeve/rip-lang/main/docs/assets/rip.png" style="width:50px" /> <br>
2
2
 
3
3
  # Rip Language Reference
4
4
 
@@ -1212,7 +1212,7 @@ Rip includes optional packages for full-stack development. All are written in Ri
1212
1212
  ```bash
1213
1213
  bun add @rip-lang/api # Web framework
1214
1214
  bun add @rip-lang/server # Production server
1215
- bun add @rip-lang/ui # Reactive web UI
1215
+ bun add @rip-lang/grid # Reactive data grid
1216
1216
  bun add @rip-lang/db # DuckDB server + client
1217
1217
  bun add @rip-lang/schema # ORM + validation
1218
1218
  bun add @rip-lang/swarm # Parallel job runner
@@ -1287,17 +1287,17 @@ rip-server myapp # Named (accessible at myapp.local)
1287
1287
  rip-server http:3000 # HTTP on specific port
1288
1288
  ```
1289
1289
 
1290
- ## @rip-lang/ui — Reactive Web Framework
1290
+ ## Rip UI — Reactive Web Framework (built into rip-lang)
1291
1291
 
1292
1292
  Zero-build reactive framework. Ships the compiler to the browser and compiles `.rip` components on demand. File-based routing, unified reactive stash, and SSE hot reload.
1293
1293
 
1294
1294
  ```coffee
1295
1295
  # Server setup (index.rip)
1296
1296
  import { get, use, start, notFound } from '@rip-lang/api'
1297
- import { ripUI } from '@rip-lang/ui/serve'
1297
+ import { ripApp } from '@rip-lang/api/app'
1298
1298
 
1299
1299
  dir = import.meta.dir
1300
- use ripUI dir: dir, components: 'routes', includes: ['ui'], watch: true
1300
+ use ripApp dir: dir, components: 'routes', includes: ['ui'], watch: true
1301
1301
  get '/css/*' -> @send "#{dir}/css/#{@req.path.slice(5)}"
1302
1302
  notFound -> @send "#{dir}/index.html", 'text/html; charset=UTF-8'
1303
1303
  start port: 3000
package/docs/RIP-TYPES.md CHANGED
@@ -1,4 +1,4 @@
1
- <img src="https://raw.githubusercontent.com/shreeve/rip-lang/main/docs/rip.png" style="width:50px" /> <br>
1
+ <img src="https://raw.githubusercontent.com/shreeve/rip-lang/main/docs/assets/rip.png" style="width:50px" /> <br>
2
2
 
3
3
  # Rip Types
4
4
 
@@ -0,0 +1,486 @@
1
+ # Web Framework Landscape: 2025–2026
2
+
3
+ > A structured comparison for evaluating the positioning of Rip UI against the
4
+ > five dominant JavaScript UI frameworks. Data gathered February 2026.
5
+
6
+ ---
7
+
8
+ ## Summary Matrix
9
+
10
+ | Dimension | React 19 | Solid.js 1.9 | Svelte 5 | Vue 3.5 | Angular 19–20 |
11
+ |--------------------------|---------------------------|---------------------------|-----------------------------|---------------------------|----------------------------|
12
+ | **Reactive model** | VDOM + compiler hints | Signals (fine-grained) | Compiler + signals (runes) | Proxy-based reactivity | Signals + zone.js (legacy) |
13
+ | **Runtime size (gzip)** | ~45 KB | ~7 KB | ~2–18 KB (scales w/ usage) | ~27–34 KB | ~50–65 KB (130 KB+ fresh) |
14
+ | **Build step** | Required (Babel/SWC+) | Required (Vite/Rollup) | Required (Svelte compiler) | Required (Vite) | Required (Angular CLI) |
15
+ | **Compiler** | React Compiler (opt-in) | Compile-time transforms | Core design (deep compiler) | Vapor mode (in progress) | AOT template compiler |
16
+ | **SSR strategy** | RSC + streaming | SolidStart (streaming) | SvelteKit (streaming) | Nuxt 3 (streaming) | Angular SSR + incremental |
17
+ | **Hydration** | Full (selective w/ RSC) | Streaming progressive | Progressive (SvelteKit) | Lazy hydration (3.5) | Incremental (on-demand) |
18
+ | **Component model** | Functions + hooks | Functions + signals | `.svelte` files + runes | SFC (script/template) | Classes → standalone fns |
19
+ | **State management** | External (Zustand, etc.) | Built-in (signals/stores) | Built-in (runes) | Built-in (ref/reactive) | Built-in (signals) + RxJS |
20
+ | **Maturity / ecosystem** | Dominant (60% job market) | Niche (~1.2% adoption) | Growing (loved by devs) | Strong (esp. APAC/EU) | Enterprise standard |
21
+
22
+ ---
23
+
24
+ ## 1. React 19+
25
+
26
+ ### Core Reactive Model
27
+ **Virtual DOM with compiler-assisted optimization.** React still diffs a virtual
28
+ tree against the real DOM, but the new React Compiler (formerly React Forget)
29
+ automatically inserts memoization, eliminating most manual `useMemo`/`useCallback`.
30
+ Components re-execute on every state change — the VDOM diffing algorithm then
31
+ determines what DOM mutations to apply.
32
+
33
+ ### Runtime Size
34
+ - **~45 KB** min+gzip for `react` + `react-dom`
35
+ - Server Components reduce *shipped* JS by keeping components server-side (zero
36
+ client JS for those components), but the React runtime itself is unchanged
37
+ - Real-world production apps with Server Components: ~156 KB total JS (vs. heavier
38
+ without RSC)
39
+
40
+ ### Build Step
41
+ Required. Babel or SWC for JSX transforms, plus a bundler (Webpack, Vite, Turbopack).
42
+ React Compiler is an additional Babel plugin. Next.js/Remix abstract most of this.
43
+
44
+ ### Developer Experience
45
+ - **Strengths:** Massive ecosystem (50,000+ npm packages), dominant job market (~60%
46
+ of frontend positions), excellent tooling (React DevTools, extensive docs), Server
47
+ Components reduce full-stack data-fetching boilerplate
48
+ - **React Compiler:** Eliminates memoization ceremony — one project removed 2,300
49
+ lines of `useMemo`/`useCallback` after migration
50
+
51
+ ### Known Pain Points
52
+ - **`useEffect` remains the #1 footgun:** Dependency array confusion, accidental
53
+ infinite loops, race conditions, memory leaks. Developers consistently misuse it
54
+ for data fetching, subscription management, and lifecycle events
55
+ - **Mental model complexity:** Rules of hooks (no conditionals, no loops), closure
56
+ stale-state bugs, the server/client component boundary adds another dimension of
57
+ mental overhead (`'use client'` directives, RSC payload format)
58
+ - **Bundle size:** Even with RSC, the base runtime is the largest among non-Angular
59
+ frameworks. Tree-shaking doesn't reduce React's core
60
+ - **Decision paralysis:** No canonical state management, routing, or data fetching —
61
+ developers must evaluate Zustand vs. Jotai vs. Redux vs. Recoil vs. signals
62
+ libraries vs. context, etc.
63
+
64
+ ### Component Composition
65
+ Functions returning JSX. Server Components (default) render on server, Client
66
+ Components (opt-in via `'use client'`) render on client. Props flow downward; state
67
+ is lifted or managed externally. Context API for dependency injection.
68
+
69
+ ### State Management
70
+ No built-in solution beyond `useState`/`useReducer`. Ecosystem solutions dominate:
71
+ Zustand, Jotai, Redux Toolkit, Recoil. React 19 adds `useActionState` and
72
+ `useOptimistic` for form/mutation state.
73
+
74
+ ### SSR / Hydration
75
+ - **React Server Components (RSC):** Components render on the server, producing a
76
+ compact binary RSC Payload. Client components receive serialized props and hydrate.
77
+ Server components ship zero JS to clients.
78
+ - **Streaming SSR:** HTML streams to the client progressively via `renderToPipeableStream`
79
+ - **Selective hydration:** Suspense boundaries allow React to hydrate high-priority
80
+ components first
81
+ - **Performance:** Initial page loads improve ~38% with RSC; e-commerce cases report
82
+ 47% load time reduction
83
+ - **Limitation:** RSC is effectively a Next.js/framework feature — raw React doesn't
84
+ provide SSR infrastructure
85
+
86
+ ---
87
+
88
+ ## 2. Solid.js 1.9 (2.0 Experimental)
89
+
90
+ ### Core Reactive Model
91
+ **True fine-grained reactivity via signals.** Components execute once — only signal
92
+ subscriptions trigger targeted DOM updates. No virtual DOM. No diffing. No
93
+ re-rendering of component functions. Signal reads automatically create subscriptions;
94
+ signal writes trigger only the exact DOM nodes that depend on them.
95
+
96
+ ### Runtime Size
97
+ - **~7 KB** min+gzip (compiler + minimal runtime)
98
+ - 3x smaller than React's initial bundle
99
+ - Near-vanilla-JS benchmark performance: scores **1.07** (vs. 1.00 for raw JS, vs.
100
+ React's **1.71** — lower is better)
101
+
102
+ ### Build Step
103
+ Required. Vite with `vite-plugin-solid` for JSX compilation. The compiler transforms
104
+ JSX into fine-grained reactive DOM operations (not virtual DOM creation).
105
+
106
+ ### Developer Experience
107
+ - **Strengths:** JSX syntax familiar to React devs, signals are simple
108
+ (`createSignal`, `createEffect`, `createMemo`), no rules-of-hooks constraints,
109
+ components run once (easier mental model for when code executes), extreme
110
+ performance out of the box
111
+ - **SolidStart 1.0:** Full-stack meta-framework with SSR, SSG, CSR, file-based
112
+ routing, server functions — comparable to Next.js but for Solid
113
+
114
+ ### Known Pain Points
115
+ - **Tiny ecosystem:** ~1.2% adoption (declining from 1.36%), disappeared from 2025
116
+ Stack Overflow survey. Few UI component libraries, limited third-party integrations
117
+ - **Bus factor:** 1,592 of 1,592 commits from Ryan Carniato; second contributor has
118
+ 33. Entire project depends on one person
119
+ - **Code quality concerns:** 204 `@ts-expect-error`/`@ts-ignore` annotations,
120
+ `type TODO = any` at the core of the signal system (persisted 4+ years)
121
+ - **Hot reload instability:** Regular crashes requiring dev server restarts
122
+ - **Job market:** Negligible hiring demand
123
+ - **Solid 2.0 is experimental:** Breaking changes to reactivity, SSR, and hydration
124
+ are in progress. No release date. SolidStart 2.0 (Vite-native) is also being
125
+ rebuilt from scratch
126
+
127
+ ### Component Composition
128
+ Functions returning JSX (same syntax as React). Components execute once — the return
129
+ value is the actual DOM. Control flow via `<Show>`, `<For>`, `<Switch>` components
130
+ (not JS conditionals, because the function body doesn't re-execute).
131
+
132
+ ### State Management
133
+ Built-in and first-class:
134
+ - `createSignal()` — atomic reactive value
135
+ - `createStore()` — nested reactive objects (Proxy-based)
136
+ - `createResource()` — async data with Suspense integration
137
+ - `createMemo()` — derived computations
138
+ No need for external state libraries in most cases.
139
+
140
+ ### SSR / Hydration
141
+ - **SolidStart:** Streaming SSR with progressive hydration
142
+ - **Islands architecture:** Partial hydration possible via Astro integration
143
+ - **Performance:** Among the fastest SSR implementations due to no VDOM overhead
144
+ - **Limitation:** SolidStart is less battle-tested than Next.js/Nuxt; the Vinxi
145
+ foundation is being replaced with pure Vite in SolidStart 2.0
146
+
147
+ ---
148
+
149
+ ## 3. Svelte 5
150
+
151
+ ### Core Reactive Model
152
+ **Compiler-first with signal-like runes.** The Svelte compiler transforms `.svelte`
153
+ files into imperative DOM operations at build time. Svelte 5 introduces "runes" — a
154
+ signal-based reactivity system using `$state`, `$derived`, `$effect` — replacing the
155
+ implicit `let`-based reactivity of Svelte 4.
156
+
157
+ Key runes:
158
+ - `$state(value)` — reactive state (backed by Proxy)
159
+ - `$state.raw(value)` — reactive but non-deep (no Proxy)
160
+ - `$derived(expr)` — computed value, auto-tracks dependencies
161
+ - `$effect(() => ...)` — side effect that re-runs on dependency changes
162
+
163
+ ### Runtime Size
164
+ - **~2–18 KB** depending on features used (compiler includes only what's needed)
165
+ - Svelte 5 achieves **up to 50% smaller bundles** vs. Svelte 4
166
+ - Production dashboard benchmark: 47 KB total JS (vs. React's 156 KB for identical
167
+ functionality)
168
+ - The "disappearing framework" ideal is partially preserved — but Svelte 5 now ships
169
+ a small runtime for the reactivity system
170
+
171
+ ### Build Step
172
+ Required. The Svelte compiler is the core of the framework — `.svelte` files are not
173
+ valid JavaScript. SvelteKit uses Vite as the build tool.
174
+
175
+ ### Developer Experience
176
+ - **Strengths:** Minimal boilerplate, single-file components with scoped CSS, runes
177
+ provide explicit reactivity that works outside `.svelte` files (in `.svelte.js` and
178
+ `.svelte.ts`), excellent tutorial/documentation, SvelteKit is batteries-included
179
+ - **Performance:** Fastest initial render in benchmarks (110ms vs. Vue 142ms vs.
180
+ React 178ms), lowest memory footprint (7.9 MB idle vs. React's 18.7 MB)
181
+
182
+ ### Known Pain Points
183
+ - **Runes add complexity:** Three state runes (`$state`, `$state.raw`,
184
+ `$state.snapshot`) force choices that didn't exist before. Proxy-based state has
185
+ non-obvious performance implications
186
+ - **Loss of "magic" simplicity:** Svelte 4's `let x = 0` reactivity was beloved for
187
+ its simplicity. Runes feel more like "React hooks but for Svelte" to some devs
188
+ - **Store deprecation:** The transparent, simple store system is deprecated in favor
189
+ of runes. Stores and runes have subtly different reactivity models that don't fully
190
+ interoperate
191
+ - **Runtime shift:** Svelte now ships actual runtime code for reactivity, moving away
192
+ from the pure "compile-away-the-framework" philosophy
193
+ - **Custom component format:** `.svelte` files are not standard JS — requires tooling
194
+ for every editor, linter, formatter, and build pipeline
195
+ - **Smaller ecosystem than React/Vue:** Fewer component libraries, less hiring demand
196
+
197
+ ### Component Composition
198
+ Single-file `.svelte` components with `<script>`, markup, and `<style>` sections.
199
+ Props via `$props()` rune. Slots for content projection. Snippets (new in Svelte 5)
200
+ for reusable template fragments.
201
+
202
+ ### State Management
203
+ Built-in via runes:
204
+ - `$state` for component-local and shared state
205
+ - `$derived` for computed values
206
+ - `$effect` for side effects
207
+ - Shared state via `.svelte.js` modules (exportable reactive state)
208
+ - Legacy stores still work but are deprecated
209
+
210
+ ### SSR / Hydration
211
+ - **SvelteKit:** Full-featured meta-framework with streaming SSR, SSG, ISR
212
+ - **Progressive hydration:** Components hydrate as needed
213
+ - **Load functions:** Data fetching runs on server, serialized to client
214
+ - **Adapter system:** Deploy to Node, Vercel, Cloudflare, static, etc.
215
+ - **Performance:** Excellent — small JS payloads mean fast hydration
216
+
217
+ ---
218
+
219
+ ## 4. Vue 3.5+
220
+
221
+ ### Core Reactive Model
222
+ **Proxy-based reactivity system.** Vue uses JavaScript Proxies to intercept
223
+ property access and mutation on reactive objects. When a reactive property is read
224
+ during a component's render, Vue tracks it as a dependency. When the property changes,
225
+ Vue re-renders only the affected components.
226
+
227
+ Key primitives:
228
+ - `ref(value)` — reactive wrapper (access via `.value`)
229
+ - `reactive(object)` — deep reactive proxy
230
+ - `computed(() => ...)` — cached derived value
231
+ - `watch()` / `watchEffect()` — explicit side effects
232
+
233
+ **Vapor Mode** (in development for Vue 3.6): A new compilation strategy that
234
+ eliminates the Virtual DOM entirely, generating direct DOM-update code similar to
235
+ Solid.js. Same developer-facing API, different compilation output.
236
+
237
+ ### Runtime Size
238
+ - **~27–34 KB** min+gzip (official: ~27 KB runtime, reported in benchmarks as ~34 KB)
239
+ - Vue 3.5: 56% memory usage improvement, 10x faster for large reactive arrays
240
+ - Vapor Mode (when stable) will further reduce overhead by removing VDOM diffing code
241
+
242
+ ### Build Step
243
+ Required. Vite (created by Vue's author, Evan You) is the standard build tool.
244
+ Single-file components (`.vue`) require the Vue compiler.
245
+
246
+ ### Developer Experience
247
+ - **Strengths:** Best learning curve among major frameworks, excellent documentation,
248
+ Composition API offers React-hooks-like composability without the footguns,
249
+ progressive adoption (can use Options API or Composition API), strong TypeScript
250
+ integration
251
+ - **Nuxt 3:** Mature meta-framework with auto-imports, file-based routing, server
252
+ routes, excellent DX
253
+
254
+ ### Known Pain Points
255
+ - **`.value` ceremony:** `ref()` requires accessing `.value` in script but not in
256
+ templates — a persistent source of confusion
257
+ - **Two API styles:** Options API vs. Composition API creates ecosystem fragmentation;
258
+ tutorials/libraries may use either
259
+ - **Vapor Mode delays:** Originally planned for Vue 3.4, now expected in 3.6+.
260
+ Compatibility challenges have pushed the timeline repeatedly
261
+ - **Enterprise adoption gaps:** Strong in APAC/EU design-led markets but limited
262
+ hiring pools in US enterprise compared to React/Angular
263
+ - **Ecosystem size:** Large but smaller than React's — fewer choices in some niches
264
+
265
+ ### Component Composition
266
+ Single-file `.vue` components with `<script setup>`, `<template>`, and `<style>`
267
+ sections. `<script setup>` is the modern default — top-level bindings are
268
+ automatically exposed to the template. Props via `defineProps()`, events via
269
+ `defineEmits()`. Slots for content projection.
270
+
271
+ ### State Management
272
+ Built-in reactivity is often sufficient:
273
+ - `ref()` / `reactive()` for local/shared state
274
+ - `computed()` for derived values
275
+ - `provide` / `inject` for dependency injection
276
+ - **Pinia** (official) for complex global state — simple, TypeScript-native, devtools
277
+ integration
278
+ - Vue 3.5+ SSR: `useId()` for hydration-safe unique IDs
279
+
280
+ ### SSR / Hydration
281
+ - **Nuxt 3:** Full-featured meta-framework (SSR, SSG, ISR, hybrid rendering)
282
+ - **Lazy hydration (Vue 3.5):** Components can defer hydration until needed
283
+ - **Streaming SSR:** Supported via Nuxt 3 + `renderToWebStream`
284
+ - **`useId()`:** Stable hydration-safe IDs for accessibility and form elements
285
+ - **Performance:** Good — smaller runtime means less JS to hydrate
286
+
287
+ ---
288
+
289
+ ## 5. Angular 19–20
290
+
291
+ ### Core Reactive Model
292
+ **Signals (new) + Zone.js change detection (legacy).** Angular is transitioning from
293
+ Zone.js-based change detection (monkey-patches all async APIs to trigger global
294
+ change detection) to a granular Signals-based system.
295
+
296
+ Signal primitives:
297
+ - `signal(value)` — writable reactive value (`.set()`, `.update()`)
298
+ - `computed(() => ...)` — read-only derived signal
299
+ - `effect(() => ...)` — side effect (stabilized in Angular 20)
300
+ - `linkedSignal()` — signal linked to a source (stabilized in Angular 20)
301
+
302
+ **Zoneless** (Developer Preview in Angular 20): Removes Zone.js entirely, relying
303
+ on Signals for change detection. Cleaner stack traces, smaller bundles, better
304
+ compatibility with third-party code.
305
+
306
+ ### Runtime Size
307
+ - **~50–65 KB** gzipped for core framework
308
+ - Fresh "Hello World" project: **130–138 KB+** min+gzip
309
+ - Removing Zone.js (zoneless) reduces this, but Angular remains the heaviest framework
310
+ - FCP: 400–800 ms (vs. Vue's 150–300 ms, React's ~300 ms)
311
+
312
+ ### Build Step
313
+ Required. Angular CLI with Webpack or esbuild. AOT (Ahead-of-Time) template
314
+ compilation is the default — templates are compiled to optimized JS at build time.
315
+ Strict project structure enforced by the CLI.
316
+
317
+ ### Developer Experience
318
+ - **Strengths:** Opinionated "batteries-included" framework (routing, forms, HTTP,
319
+ i18n, testing all built-in), excellent for large teams with enforced patterns,
320
+ strong TypeScript integration (TypeScript is required, not optional), dependency
321
+ injection is powerful for enterprise architecture
322
+ - **Angular 19–20 improvements:** Standalone components as default (no more
323
+ NgModules), Signals stabilized, resource API for async data, better DevTools
324
+
325
+ ### Known Pain Points
326
+ - **Boilerplate:** Even with standalone components, Angular requires more ceremony
327
+ than alternatives. Decorators, metadata, DI registration
328
+ - **Change detection confusion:** `ExpressionChangedAfterItHasBeenCheckedError`
329
+ produces stack traces pointing to framework code, not developer code. This error
330
+ has been a top Angular complaint for years
331
+ - **Bundle size:** Largest runtime of all major frameworks. Zone.js adds ~35 KB alone
332
+ - **Learning curve:** Steepest of all frameworks. New hires struggle for months.
333
+ RxJS adds another learning dimension on top of Signals
334
+ - **Two reactive paradigms:** RxJS Observables and Signals now coexist, creating
335
+ confusion about when to use which. `toSignal()` / `toObservable()` bridge the gap
336
+ but add complexity
337
+ - **DI runtime errors:** "No provider for X!" errors are common and hard to debug
338
+
339
+ ### Component Composition
340
+ Standalone components (Angular 19+ default) — no NgModule required. Components are
341
+ TypeScript classes with decorators. Templates use Angular's own syntax (`@if`, `@for`,
342
+ `@switch` — new control flow in Angular 17+). Content projection via `<ng-content>`.
343
+ Directives for cross-cutting behavior.
344
+
345
+ ### State Management
346
+ Built-in (increasingly):
347
+ - Signals for synchronous reactive state
348
+ - RxJS for async streams (legacy but deeply embedded)
349
+ - Services + DI for shared state
350
+ - **NgRx** (Redux-like) for complex enterprise state — being updated for Signals
351
+ - **Resource API** (Angular 19+) for async data fetching with Signals integration
352
+
353
+ ### SSR / Hydration
354
+ - **Angular SSR:** Built-in (formerly Angular Universal), now tightly integrated
355
+ - **Incremental hydration:** Components stay dehydrated until triggered. Triggers:
356
+ `viewport`, `interaction`, `idle`, `timer(ms)`, `immediate`, `never`,
357
+ `when(condition)`
358
+ - **`@defer` blocks:** Lazy-load components with built-in hydration trigger syntax
359
+ - **Event replay:** User interactions during SSR are captured and replayed after
360
+ hydration (Angular 18+)
361
+ - **Performance:** Incremental hydration significantly improves FID and CLS, but
362
+ larger initial bundle still creates overhead vs. lighter frameworks
363
+
364
+ ---
365
+
366
+ ## Cross-Cutting Analysis
367
+
368
+ ### The Convergence Toward Signals
369
+
370
+ Every major framework is converging on signal-based reactivity:
371
+
372
+ | Framework | Signal Implementation | Status |
373
+ |-----------|------------------------------------|------------------|
374
+ | Solid.js | Pioneered the pattern | Stable (1.x) |
375
+ | Angular | `signal()`, `computed()`, `effect()` | Stable (v20) |
376
+ | Vue | `ref()`, `reactive()`, `computed()` | Stable (v3.0+) |
377
+ | Svelte | `$state`, `$derived`, `$effect` | Stable (v5) |
378
+ | React | No signals — VDOM + Compiler | Divergent path |
379
+
380
+ React is the outlier. Every other framework has adopted signals (or signal-like
381
+ reactivity). React's response is the React Compiler — automating VDOM optimizations
382
+ rather than changing the reactive model.
383
+
384
+ ### The Compiler Spectrum
385
+
386
+ Frameworks sit on a spectrum from pure runtime to pure compiler:
387
+
388
+ ```
389
+ Pure Runtime ←——————————————————————————→ Pure Compiler
390
+ React Vue Angular Svelte (Solid)
391
+ (VDOM + (Proxy + (AOT + (Compiler + (Compiler +
392
+ Compiler future template runes signals,
393
+ hints) Vapor) compile) runtime) minimal RT)
394
+ ```
395
+
396
+ - **React:** Mostly runtime. Compiler adds optimization hints but doesn't change
397
+ the execution model.
398
+ - **Vue:** Runtime reactivity. Vapor Mode will add a compiler path that bypasses VDOM.
399
+ - **Angular:** AOT template compilation + runtime change detection. Signals are
400
+ reducing runtime overhead.
401
+ - **Svelte:** Deep compiler, but Svelte 5 added a signal runtime. Shifting right
402
+ to left.
403
+ - **Solid:** Compiler transforms JSX to fine-grained DOM ops. Minimal runtime (~7 KB).
404
+
405
+ ### Where the Gaps Are (Opportunities for Rip UI)
406
+
407
+ 1. **No framework has unified the server/client model cleanly.** React's RSC is the
408
+ most ambitious attempt but creates a two-world problem (`'use client'` directives,
409
+ different rules for each). Every other framework punts to a meta-framework (Nuxt,
410
+ SvelteKit, SolidStart).
411
+
412
+ 2. **Reactivity is powerful but each flavor has ergonomic costs.** React's hooks have
413
+ rules and footguns. Vue's `.value` is a papercut. Svelte's runes added complexity.
414
+ Angular's Signals coexist awkwardly with RxJS. Solid's signals are elegant but the
415
+ JSX control flow (`<For>`, `<Show>`) is a compromise.
416
+
417
+ 3. **Bundle size vs. DX is an unresolved tension.** Svelte and Solid ship tiny bundles
418
+ but require custom file formats or component-level conventions. React and Angular
419
+ are heavy but offer familiar JS/TS ergonomics.
420
+
421
+ 4. **State management is fragmented.** React has no built-in solution (dozens of
422
+ competing libraries). Vue/Svelte/Solid have built-in primitives but each with
423
+ quirks. Angular has two competing paradigms (RxJS + Signals).
424
+
425
+ 5. **Hydration is still a problem everyone is solving differently.** Full hydration
426
+ (wasteful), progressive hydration (complex), incremental hydration (Angular's
427
+ approach), resumability (Qwik's approach). No consensus, each with trade-offs.
428
+
429
+ 6. **TypeScript integration varies.** Angular requires it. React/Vue/Svelte support
430
+ it but with varying degrees of type inference quality (Svelte's compiler and Vue's
431
+ SFC templates are harder to type-check than plain TSX).
432
+
433
+ 7. **Custom file formats create tooling tax.** `.svelte`, `.vue`, `.astro` files
434
+ each need custom language server support, linter plugins, formatter configs. Plain
435
+ `.js`/`.ts` (React, Solid) avoid this at the cost of less framework-level
436
+ optimization.
437
+
438
+ ### Performance Benchmarks (JS Framework Benchmark, 2025)
439
+
440
+ | Framework | Score (lower = faster) | Startup (ms) | Memory (MB) |
441
+ |-------------|------------------------|-------------|-------------|
442
+ | Vanilla JS | 1.00 | — | — |
443
+ | Solid.js | 1.07 | 28 | ~8 |
444
+ | Svelte 5 | ~1.10 | 35 | ~8 |
445
+ | Vue 3 | ~1.30 | 42 | ~11 |
446
+ | React 19 | 1.71 | 55 | ~19 |
447
+ | Angular 19 | ~1.80+ | 78 | ~22 |
448
+
449
+ ---
450
+
451
+ ## Positioning Questions for Rip UI
452
+
453
+ Based on this landscape, a new framework should be prepared to answer:
454
+
455
+ 1. **Reactive model:** Signals, VDOM, compiler-generated, or something new? The
456
+ industry has nearly converged on signals — deviating needs a strong argument.
457
+
458
+ 2. **Compiler depth:** How much work happens at build time vs. runtime? The trend is
459
+ toward more compilation, but each compiler approach creates tooling complexity.
460
+
461
+ 3. **Runtime weight:** Can you beat Solid's 7 KB? Can you approach zero-runtime like
462
+ original Svelte promised? What's the minimum viable runtime?
463
+
464
+ 4. **Server integration:** Is the server/client boundary a first-class concept? Can
465
+ it avoid the `'use client'` / meta-framework split that plagues React?
466
+
467
+ 5. **Hydration strategy:** Full, progressive, incremental, resumable, or none? This
468
+ is the current frontier of framework innovation.
469
+
470
+ 6. **File format:** Custom (`.svelte`, `.vue`) or standard JS/TS? Custom formats
471
+ enable deeper optimization but impose ecosystem costs.
472
+
473
+ 7. **State management:** Built-in or ecosystem? Every framework that delegated this
474
+ to the ecosystem (React) regrets it. Every framework with built-in state must
475
+ balance simplicity with power.
476
+
477
+ 8. **TypeScript story:** First-class types? Type inference quality? Can the framework
478
+ provide better type safety than existing options?
479
+
480
+ 9. **Migration story:** Can React/Vue/Svelte developers adopt incrementally, or is it
481
+ all-or-nothing?
482
+
483
+ 10. **What's the one thing you can do that none of them can?** Every successful
484
+ framework had a clear differentiator: React had the VDOM (2013), Vue had
485
+ progressive adoption (2014), Svelte had compile-away-the-framework (2019),
486
+ Solid had true fine-grained reactivity (2021), Qwik had resumability (2023).