@vertz/ui-server 0.2.49 → 0.2.53

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 ADDED
@@ -0,0 +1,723 @@
1
+ # @vertz/ui-server
2
+
3
+ ## 0.2.53
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies []:
8
+ - @vertz/core@0.2.53
9
+ - @vertz/ui@0.2.53
10
+
11
+ ## 0.2.52
12
+
13
+ ### Patch Changes
14
+
15
+ - Updated dependencies []:
16
+ - @vertz/core@0.2.52
17
+ - @vertz/ui@0.2.52
18
+
19
+ ## 0.2.51
20
+
21
+ ### Patch Changes
22
+
23
+ - Updated dependencies []:
24
+ - @vertz/core@0.2.51
25
+ - @vertz/ui@0.2.51
26
+
27
+ ## 0.2.50
28
+
29
+ ### Patch Changes
30
+
31
+ - Updated dependencies []:
32
+ - @vertz/core@0.2.50
33
+ - @vertz/ui@0.2.50
34
+
35
+ ## 0.2.49
36
+
37
+ ### Patch Changes
38
+
39
+ - Updated dependencies []:
40
+ - @vertz/core@0.2.49
41
+ - @vertz/ui@0.2.49
42
+
43
+ ## 0.2.48
44
+
45
+ ### Patch Changes
46
+
47
+ - Updated dependencies [[`46397c6`](https://github.com/vertz-dev/vertz/commit/46397c67af30f5441cebdca616f3a1627111312d), [`36b0f20`](https://github.com/vertz-dev/vertz/commit/36b0f2007822bc5c580d04a30d4ef1ecbee2146b)]:
48
+ - @vertz/ui@0.2.48
49
+ - @vertz/core@0.2.48
50
+
51
+ ## 0.2.47
52
+
53
+ ### Patch Changes
54
+
55
+ - Updated dependencies []:
56
+ - @vertz/core@0.2.47
57
+ - @vertz/ui@0.2.47
58
+
59
+ ## 0.2.46
60
+
61
+ ### Patch Changes
62
+
63
+ - [#2239](https://github.com/vertz-dev/vertz/pull/2239) [`d029bfc`](https://github.com/vertz-dev/vertz/commit/d029bfcef05d9226f6740b5854827904144dc7ba) Thanks [@viniciusdacal](https://github.com/viniciusdacal)! - feat(server): allow customizing or removing the `/api/` route prefix (#2131)
64
+
65
+ - `createServer({ apiPrefix: '/v1' })` changes all generated routes from `/api/*` to `/v1/*`
66
+ - API-only apps can use `apiPrefix: ''` to mount routes at the root
67
+ - Full-stack apps require a non-empty prefix (enforced at dev server and Cloudflare handler)
68
+ - Auth cookie paths (`Path=`) automatically follow the resolved prefix
69
+ - Cloudflare handler reads `app.apiPrefix` at runtime when not explicitly configured
70
+ - `basePath` option in `@vertz/cloudflare` renamed to `apiPrefix` for consistency
71
+
72
+ - Updated dependencies [[`d029bfc`](https://github.com/vertz-dev/vertz/commit/d029bfcef05d9226f6740b5854827904144dc7ba)]:
73
+ - @vertz/core@0.2.46
74
+ - @vertz/ui@0.2.46
75
+
76
+ ## 0.2.45
77
+
78
+ ### Patch Changes
79
+
80
+ - [#2201](https://github.com/vertz-dev/vertz/pull/2201) [`57c5b6f`](https://github.com/vertz-dev/vertz/commit/57c5b6ffe2f79fa374384567ad2e48897dbd5482) Thanks [@viniciusdacal](https://github.com/viniciusdacal)! - fix: collect import-time CSS from native compiler without requiring module.getInjectedCSS export
81
+
82
+ - Updated dependencies []:
83
+ - @vertz/core@0.2.45
84
+ - @vertz/ui@0.2.45
85
+
86
+ ## 0.2.44
87
+
88
+ ### Patch Changes
89
+
90
+ - Updated dependencies []:
91
+ - @vertz/core@0.2.44
92
+ - @vertz/ui@0.2.44
93
+
94
+ ## 0.2.43
95
+
96
+ ### Patch Changes
97
+
98
+ - [#2192](https://github.com/vertz-dev/vertz/pull/2192) [`d9380cc`](https://github.com/vertz-dev/vertz/commit/d9380cc4b09a98f83df1213b4c380f2984a53579) Thanks [@viniciusdacal](https://github.com/viniciusdacal)! - Remove legacy two-pass SSR (`ssrRenderToString`, `ssrDiscoverQueries`) in favor of single-pass SSR (`ssrRenderSinglePass`) and AOT SSR (`ssrRenderAot`). The `ssrStreamNavQueries` function now uses a shared `runQueryDiscovery()` helper instead of the old two-pass discovery pipeline. Renamed `ssr-render.ts` to `ssr-shared.ts` (shared types and utilities only).
99
+
100
+ - Updated dependencies []:
101
+ - @vertz/core@0.2.43
102
+ - @vertz/ui@0.2.43
103
+
104
+ ## 0.2.42
105
+
106
+ ### Patch Changes
107
+
108
+ - [#2100](https://github.com/vertz-dev/vertz/pull/2100) [`aca62b0`](https://github.com/vertz-dev/vertz/commit/aca62b09d42330cd81a106b65082b3e17fba7c91) Thanks [@viniciusdacal](https://github.com/viniciusdacal)! - Fix AOT resolveValueInline to handle property-specific raw value resolution (position offsets, aspect ratios, grid-cols, tracking, transition aliases, border side widths)
109
+
110
+ - [#2149](https://github.com/vertz-dev/vertz/pull/2149) [`1eeec6c`](https://github.com/vertz-dev/vertz/commit/1eeec6c95c0ced4d869995dbdce205c3bde92a25) Thanks [@viniciusdacal](https://github.com/viniciusdacal)! - Fix Input component focus loss with value+onInput binding: handle IDL properties (value, checked) via Reflect.set in \_\_spread, preserve getter descriptors in withStyles, and emit reactive source parameter from compiler
111
+
112
+ - [#2182](https://github.com/vertz-dev/vertz/pull/2182) [`6e3fb13`](https://github.com/vertz-dev/vertz/commit/6e3fb1346d6a0bf5ca2d4a5bb9d5680a85e9ead1) Thanks [@viniciusdacal](https://github.com/viniciusdacal)! - Remove @vertz/ui-compiler package — all compilation now uses the native Rust compiler exclusively via @vertz/ui-server
113
+
114
+ - Updated dependencies [[`caaee34`](https://github.com/vertz-dev/vertz/commit/caaee3414f28d055b3065dc2d4ef67c9e3856ab9), [`1eeec6c`](https://github.com/vertz-dev/vertz/commit/1eeec6c95c0ced4d869995dbdce205c3bde92a25)]:
115
+ - @vertz/ui@0.2.42
116
+ - @vertz/core@0.2.42
117
+
118
+ ## 0.2.41
119
+
120
+ ### Patch Changes
121
+
122
+ - [#2027](https://github.com/vertz-dev/vertz/pull/2027) [`7f837fc`](https://github.com/vertz-dev/vertz/commit/7f837fc10a0acd4ad77bfc4bcaf733700c8a4f8b) Thanks [@viniciusdacal](https://github.com/viniciusdacal)! - Add `googleFont()` API for automatic Google Fonts fetching.
123
+
124
+ - `googleFont(family, options)` returns a `FontDescriptor` with `__google` metadata
125
+ - Dev server resolves Google Font descriptors at startup and on HMR, downloading `.woff2` files to `.vertz/fonts/` cache
126
+ - Subset-aware parsing selects the correct `.woff2` file (latin by default) instead of the first alphabetical subset
127
+ - Font metrics extraction handles absolute and root-relative paths from the resolver
128
+ - New exports from `@vertz/ui/css`: `googleFont`, `GoogleFontOptions`, `GoogleFontMeta`
129
+
130
+ - Updated dependencies [[`7f837fc`](https://github.com/vertz-dev/vertz/commit/7f837fc10a0acd4ad77bfc4bcaf733700c8a4f8b)]:
131
+ - @vertz/ui@0.2.41
132
+ - @vertz/core@0.2.41
133
+ - @vertz/ui-compiler@0.2.41
134
+
135
+ ## 0.2.40
136
+
137
+ ### Patch Changes
138
+
139
+ - [#1980](https://github.com/vertz-dev/vertz/pull/1980) [`bee011e`](https://github.com/vertz-dev/vertz/commit/bee011e47661b31152ad3dfc589fd45eda2f3e44) Thanks [@viniciusdacal](https://github.com/viniciusdacal)! - fix(ui-server, ui-compiler, ui, theme-shadcn): AOT SSR pipeline composes App layout shell, portable holes, barrel extraction, CSS inlining, and lazy theme CSS
140
+
141
+ Five AOT SSR fixes:
142
+
143
+ 1. **App layout composition (#1977)**: The AOT pipeline now wraps page content in the root App layout (header, nav, footer). The build pipeline detects the App component by its RouterView hole, includes it in the AOT manifest, and the runtime pipeline renders the App shell around each page. Gracefully degrades if app render fails.
144
+
145
+ 2. **Portable hole references (#1981)**: The AOT compiler now emits `ctx.holes.ComponentName()` for imported components instead of `__ssr_ComponentName()`. The `__ssr_` prefix is a Bun-internal convention that breaks on non-Bun bundlers (esbuild/workerd). Local components in the same file still use direct `__ssr_*` calls for efficiency.
146
+
147
+ 3. **Side-effect-free barrel (#1982)**: The AOT barrel generation now extracts only the `__ssr_*` function declarations from compiled code, excluding original imports and module-level side effects (createRouter, themeGlobals, etc.). This eliminates ~16MB bundle bloat when bundled with esbuild for workerd.
148
+
149
+ 4. **CSS class name inlining (#1985)**: The AOT compiler now inlines `css()` class names as literal strings in `__ssr_*` functions. Previously, the barrel extraction stripped module-level `const s = css({...})` declarations but functions still referenced `s.root` etc., causing ReferenceError. Now the compiler computes deterministic class names at compile time (same DJB2 hash as the CSS extractor) and replaces references inline.
150
+
151
+ 5. **Lazy theme CSS compilation (#1979)**: SSR responses no longer include ~74KB of unused theme component CSS. `configureTheme()` previously compiled all ~40 component styles eagerly via `buildComponents()`. Now each component has its own lazy getter (`lazyComp`/`lazyPrim`) — styles are compiled only when a component is first accessed at render time. `registerTheme()` stores the theme object without accessing `.components`, preserving the per-component lazy getters. As a defense-in-depth fallback, when the per-request `cssTracker` is empty, `collectCSS()` filters the global CSS set by matching class selectors against the rendered HTML.
152
+
153
+ 6. **Tree-shake unused theme CSS from SSR (#1988)**: `filterCSSByHTML()` now correctly handles standalone `@keyframes` at-rules. Previously, `@keyframes` blocks bypassed the class-selector filter (they don't start with `.`) and were always included — adding ~10KB of dead animation CSS per page. The filter now uses two-pass logic: first pass partitions CSS into class-based rules (filtered by HTML usage), global rules (always kept), and standalone `@keyframes` (deferred); second pass keeps `@keyframes` only if a surviving CSS rule references the animation name.
154
+
155
+ 7. **AOT CSS extraction for non-Bun bundlers (#1989)**: CSS from `css()` calls is now extracted at AOT compile time and embedded in `aot-manifest.json`. Previously, AOT `__ssr_*` functions used inlined class names (#1985) but the actual CSS rules depended on runtime `css()` side effects. On esbuild/workerd, these side effects are tree-shaken (the `css()` return value is unused) or land in a different module instance's `injectedCSS` Set. Now `compileForSSRAot()` runs `CSSAnalyzer` + `CSSTransformer.extractCSS()` to capture CSS rules at build time. The manifest CSS is used as the primary source in `collectCSSFromModule()`, with `getInjectedCSS()` as a filtered supplement for `variants()`/`keyframes()` CSS that can't be statically extracted.
156
+
157
+ 8. **Per-route CSS at build time with zero runtime overhead (#1988, #1989)**: CSS filtering moved entirely to build time. `attachPerRouteCss()` scans `__ssr_*` function code for `_[0-9a-f]{8}` class references and embeds only matching CSS rules per route in the manifest. At runtime, `mergeRouteCss()` does a cheap O(n) array concat. The CSS result is cached per route pattern after the first request, eliminating all per-request Set/Array/join allocations that caused GC-induced tail latency spikes under concurrent load.
158
+
159
+ - Updated dependencies [[`bee011e`](https://github.com/vertz-dev/vertz/commit/bee011e47661b31152ad3dfc589fd45eda2f3e44), [`f523a42`](https://github.com/vertz-dev/vertz/commit/f523a4282996d72c17be9f2a674a34a244455cba)]:
160
+ - @vertz/ui-compiler@0.2.40
161
+ - @vertz/ui@0.2.40
162
+ - @vertz/core@0.2.40
163
+
164
+ ## 0.2.39
165
+
166
+ ### Patch Changes
167
+
168
+ - Updated dependencies [[`7bf733f`](https://github.com/vertz-dev/vertz/commit/7bf733fec92424d08a08dafe3b4c4a5984f084b0), [`a948ef1`](https://github.com/vertz-dev/vertz/commit/a948ef160c244fb2e42cd53e7190b8bf6a96f9db)]:
169
+ - @vertz/ui@0.2.39
170
+ - @vertz/core@0.2.39
171
+ - @vertz/ui-compiler@0.2.39
172
+
173
+ ## 0.2.38
174
+
175
+ ### Patch Changes
176
+
177
+ - [#1938](https://github.com/vertz-dev/vertz/pull/1938) [`93aa341`](https://github.com/vertz-dev/vertz/commit/93aa34166ad4934ec5c7e45fd7d7327e0843d174) Thanks [@viniciusdacal](https://github.com/viniciusdacal)! - Fix AOT compiler crash on `.map()` callbacks with closure variables (#1936). The compiler now falls back to runtime evaluation when a map callback defines local variables before its return statement. Also adds graceful fallback from AOT to single-pass SSR when the render function throws at runtime.
178
+
179
+ - Updated dependencies [[`93aa341`](https://github.com/vertz-dev/vertz/commit/93aa34166ad4934ec5c7e45fd7d7327e0843d174), [`20344c0`](https://github.com/vertz-dev/vertz/commit/20344c0a7df8260ce98034bd0e2de73ef11ecfcd)]:
180
+ - @vertz/ui-compiler@0.2.38
181
+ - @vertz/ui@0.2.38
182
+ - @vertz/core@0.2.38
183
+
184
+ ## 0.2.37
185
+
186
+ ### Patch Changes
187
+
188
+ - Updated dependencies [[`12231be`](https://github.com/vertz-dev/vertz/commit/12231be46d322526be6d8b6752911d88f025e4d0)]:
189
+ - @vertz/ui@0.2.37
190
+ - @vertz/core@0.2.37
191
+ - @vertz/ui-compiler@0.2.37
192
+
193
+ ## 0.2.36
194
+
195
+ ### Patch Changes
196
+
197
+ - [#1895](https://github.com/vertz-dev/vertz/pull/1895) [`0e655d6`](https://github.com/vertz-dev/vertz/commit/0e655d60183badb73103feffbc70c34f6b442e6c) Thanks [@viniciusdacal](https://github.com/viniciusdacal)! - Add `aotDataResolver` option to `createSSRHandler` and `ssrRenderAot` for custom data sources in AOT rendering
198
+
199
+ - [#1900](https://github.com/vertz-dev/vertz/pull/1900) [`ae4859c`](https://github.com/vertz-dev/vertz/commit/ae4859c5b836b083fd563189521ccc6c4be5ffe8) Thanks [@viniciusdacal](https://github.com/viniciusdacal)! - Surface plugin syntax errors as build errors in the dev server overlay instead of showing misleading "must export App" message
200
+
201
+ - Updated dependencies [[`94a3244`](https://github.com/vertz-dev/vertz/commit/94a32446298cc6d8b76849abec315e980d5a4341), [`9281153`](https://github.com/vertz-dev/vertz/commit/9281153c407654e4cf26c5c41af3274128301e3e)]:
202
+ - @vertz/ui@0.2.36
203
+ - @vertz/core@0.2.36
204
+ - @vertz/ui-compiler@0.2.36
205
+
206
+ ## 0.2.35
207
+
208
+ ### Patch Changes
209
+
210
+ - [#1882](https://github.com/vertz-dev/vertz/pull/1882) [`bb784d0`](https://github.com/vertz-dev/vertz/commit/bb784d052fe4abf27f5f499923de0a1f20a06c1b) Thanks [@viniciusdacal](https://github.com/viniciusdacal)! - Fix AOT route extraction to handle dynamic imports, function calls, and bare identifiers alongside existing JSX patterns. Fix AOT bundle failures caused by missing helper imports and query variable scope leaks. Fix AOT route matcher to use exact matching instead of prefix matching, preventing `/` from matching all URLs. Externalize relative imports in AOT bundle step to prevent resolution failures in .aot-tmp. Improve AOT bundle error logging with detailed messages and stack traces.
211
+
212
+ - Updated dependencies [[`bb784d0`](https://github.com/vertz-dev/vertz/commit/bb784d052fe4abf27f5f499923de0a1f20a06c1b), [`5a80932`](https://github.com/vertz-dev/vertz/commit/5a8093299d96eefd00f0208af61eeb37aef28014)]:
213
+ - @vertz/ui-compiler@0.2.35
214
+ - @vertz/ui@0.2.35
215
+ - @vertz/core@0.2.35
216
+
217
+ ## 0.2.34
218
+
219
+ ### Patch Changes
220
+
221
+ - Updated dependencies [[`8076db5`](https://github.com/vertz-dev/vertz/commit/8076db590be9a593321d6de4cad6590d41e3c83c), [`3399191`](https://github.com/vertz-dev/vertz/commit/339919192bd95b5d212abf7f6d3746101c8d5422)]:
222
+ - @vertz/ui-compiler@0.2.34
223
+ - @vertz/ui@0.2.34
224
+ - @vertz/core@0.2.34
225
+
226
+ ## 0.2.33
227
+
228
+ ### Patch Changes
229
+
230
+ - Updated dependencies [[`37fb6dc`](https://github.com/vertz-dev/vertz/commit/37fb6dcb125c561ec0113a1ee9314426fa50255e)]:
231
+ - @vertz/ui-compiler@0.2.33
232
+ - @vertz/core@0.2.33
233
+ - @vertz/ui@0.2.33
234
+
235
+ ## 0.2.32
236
+
237
+ ### Patch Changes
238
+
239
+ - [#1854](https://github.com/vertz-dev/vertz/pull/1854) [`ce47098`](https://github.com/vertz-dev/vertz/commit/ce47098edb664d7a005dbdca881efbe63fb4dda2) Thanks [@viniciusdacal](https://github.com/viniciusdacal)! - Wire AOT SSR pipeline end-to-end: compiler generates standalone `(data, ctx)` render functions for query-using components, build emits `aot-routes.js` + `aot-manifest.json`, and `createSSRHandler()` uses AOT render with data prefetch when manifest is available. Falls back to single-pass SSR for routes without AOT entries.
240
+
241
+ - Updated dependencies [[`ce47098`](https://github.com/vertz-dev/vertz/commit/ce47098edb664d7a005dbdca881efbe63fb4dda2), [`ca59e8b`](https://github.com/vertz-dev/vertz/commit/ca59e8b824806cc222521677abbdcbb753347969)]:
242
+ - @vertz/ui-compiler@0.2.32
243
+ - @vertz/ui@0.2.32
244
+ - @vertz/core@0.2.32
245
+
246
+ ## 0.2.31
247
+
248
+ ### Patch Changes
249
+
250
+ - [#1846](https://github.com/vertz-dev/vertz/pull/1846) [`86b1b76`](https://github.com/vertz-dev/vertz/commit/86b1b763b3b7598be442c04afe94acae0b5603c2) Thanks [@viniciusdacal](https://github.com/viniciusdacal)! - Add native Node HTTP adapter (`createNodeHandler`) that writes SSR output directly to `ServerResponse`, eliminating web Request/Response conversion overhead on Node.js. Import from `@vertz/ui-server/node`.
251
+
252
+ - Updated dependencies []:
253
+ - @vertz/core@0.2.31
254
+ - @vertz/ui@0.2.31
255
+ - @vertz/ui-compiler@0.2.31
256
+
257
+ ## 0.2.30
258
+
259
+ ### Patch Changes
260
+
261
+ - Updated dependencies [[`3bf1c88`](https://github.com/vertz-dev/vertz/commit/3bf1c882c258ba9989feac2b27d00809af1d6415), [`e75e501`](https://github.com/vertz-dev/vertz/commit/e75e5014917608b33fca1668e275948e16a0d773), [`0ba086d`](https://github.com/vertz-dev/vertz/commit/0ba086d9bca13cac9e0a27a1cbd199c8b5ca6a07), [`1d36182`](https://github.com/vertz-dev/vertz/commit/1d36182b0678378d50d9a063d6471a9114712b6a)]:
262
+ - @vertz/ui-compiler@0.2.30
263
+ - @vertz/core@0.2.30
264
+ - @vertz/ui@0.2.30
265
+
266
+ ## 0.2.29
267
+
268
+ ### Patch Changes
269
+
270
+ - Updated dependencies [[`7771170`](https://github.com/vertz-dev/vertz/commit/777117093d783aaeecc905ec65c4c85363746494)]:
271
+ - @vertz/ui@0.2.29
272
+ - @vertz/ui-compiler@0.2.29
273
+ - @vertz/core@0.2.29
274
+
275
+ ## 0.2.28
276
+
277
+ ### Patch Changes
278
+
279
+ - Updated dependencies [[`a5ac6e1`](https://github.com/vertz-dev/vertz/commit/a5ac6e19f5642e3981c0bb96ae8de8bf574c60dc)]:
280
+ - @vertz/ui-compiler@0.2.28
281
+ - @vertz/core@0.2.28
282
+ - @vertz/ui@0.2.28
283
+
284
+ ## 0.2.27
285
+
286
+ ### Patch Changes
287
+
288
+ - [#1770](https://github.com/vertz-dev/vertz/pull/1770) [`c40f504`](https://github.com/vertz-dev/vertz/commit/c40f5048e8ec551318f8daf4b98349c590c11553) Thanks [@viniciusdacal](https://github.com/viniciusdacal)! - fix(ui-server): populate entitlements in toPrefetchSession from access set
289
+
290
+ - Updated dependencies []:
291
+ - @vertz/core@0.2.27
292
+ - @vertz/ui@0.2.27
293
+ - @vertz/ui-compiler@0.2.27
294
+
295
+ ## 0.2.26
296
+
297
+ ### Patch Changes
298
+
299
+ - Updated dependencies [[`8552f21`](https://github.com/vertz-dev/vertz/commit/8552f217350e2acb0caac26ac215a49736b07e55)]:
300
+ - @vertz/ui@0.2.26
301
+ - @vertz/core@0.2.26
302
+ - @vertz/ui-compiler@0.2.26
303
+
304
+ ## 0.2.25
305
+
306
+ ### Patch Changes
307
+
308
+ - Updated dependencies [[`04673a3`](https://github.com/vertz-dev/vertz/commit/04673a32a4849db08d80bb39caf801295fec9832), [`841c9ae`](https://github.com/vertz-dev/vertz/commit/841c9ae69b559d25ed443d3c5fa8e21b2fd174bf)]:
309
+ - @vertz/ui@0.2.25
310
+ - @vertz/ui-compiler@0.2.25
311
+ - @vertz/core@0.2.25
312
+
313
+ ## 0.2.24
314
+
315
+ ### Patch Changes
316
+
317
+ - [#1695](https://github.com/vertz-dev/vertz/pull/1695) [`de3cb15`](https://github.com/vertz-dev/vertz/commit/de3cb15e9ecad1a4cec60cc21b6a9236fd4e6324) Thanks [@viniciusdacal](https://github.com/viniciusdacal)! - Fix auto field selection not tracking field accesses in child components. Previously, when query data was passed to child components via props, the child's field accesses were silently missed, causing the query to under-fetch (only fields accessed directly in the parent were included in `select`).
318
+
319
+ **What changed:**
320
+
321
+ - Cross-file field resolution now falls back to fetching all fields (opaque) when a child component's field accesses can't be determined, instead of silently under-fetching
322
+ - Barrel file re-exports (`export { Foo } from './bar'`) are now followed to find the actual component definition
323
+ - Renamed re-exports (`export { Internal as Public }`) are handled correctly
324
+ - The plugin pre-pass now scans `.ts` files (not just `.tsx`) to capture barrel file re-exports
325
+ - HMR updates now process `.ts` file changes for field selection manifest updates
326
+
327
+ - Updated dependencies [[`a73dd79`](https://github.com/vertz-dev/vertz/commit/a73dd792de1876513914b89ef896fc88243b4cc8), [`d58a100`](https://github.com/vertz-dev/vertz/commit/d58a100f18762189be4319b58a4b86f8a774ac95), [`0e33400`](https://github.com/vertz-dev/vertz/commit/0e33400d96a9f778f3b936124d7544804f731db9), [`e24615a`](https://github.com/vertz-dev/vertz/commit/e24615a8619ae84b993c18dbdca2671ca254f9bb), [`adea2f1`](https://github.com/vertz-dev/vertz/commit/adea2f15f306d09ecebc56fc1f3841ff4b14b2ba)]:
328
+ - @vertz/ui@0.2.24
329
+ - @vertz/ui-compiler@0.2.24
330
+ - @vertz/core@0.2.24
331
+
332
+ ## 0.2.23
333
+
334
+ ### Patch Changes
335
+
336
+ - [#1588](https://github.com/vertz-dev/vertz/pull/1588) [`7c146e6`](https://github.com/vertz-dev/vertz/commit/7c146e695b642affeb39134beb0e1eb6475f20a8) Thanks [@viniciusdacal](https://github.com/viniciusdacal)! - Fix reactive form element properties (`value`, `checked`, `selected`) to use DOM property assignment instead of `setAttribute`. This fixes `<select value={signal}>`, `<input value={signal}>`, `<input checked={signal}>`, and `<option selected={signal}>` not updating the displayed state reactively.
337
+
338
+ - Updated dependencies [[`eb1e2d6`](https://github.com/vertz-dev/vertz/commit/eb1e2d6df1923c2fd7525c58281bb1b13e52750a), [`10f6309`](https://github.com/vertz-dev/vertz/commit/10f6309790bff69c7a1a0ab92e50f78f34b129c3), [`1709f6d`](https://github.com/vertz-dev/vertz/commit/1709f6d933f04600d1b959b51660f2f8f33805d8), [`1e26cca`](https://github.com/vertz-dev/vertz/commit/1e26cca7eca00291633a2fa6257fc80a1f409b60), [`83c3a67`](https://github.com/vertz-dev/vertz/commit/83c3a67ca7de53a7c79fb650250b33b0ed05329f), [`82055ae`](https://github.com/vertz-dev/vertz/commit/82055aefc19e4c3a115152f2e7157389486e792e), [`e085298`](https://github.com/vertz-dev/vertz/commit/e085298955cdc027e1db6117c83912b9fc0cb0b0), [`4ff38bb`](https://github.com/vertz-dev/vertz/commit/4ff38bbdb34204b6de388a09152a174b7e16406c), [`a21f762`](https://github.com/vertz-dev/vertz/commit/a21f76239e5c4b112c7be9a4ebea8327c3d2230b), [`7c146e6`](https://github.com/vertz-dev/vertz/commit/7c146e695b642affeb39134beb0e1eb6475f20a8)]:
339
+ - @vertz/ui-compiler@0.2.23
340
+ - @vertz/ui@0.2.23
341
+ - @vertz/core@0.2.23
342
+
343
+ ## 0.2.22
344
+
345
+ ### Patch Changes
346
+
347
+ - Updated dependencies [[`8ed55f6`](https://github.com/vertz-dev/vertz/commit/8ed55f6fc8aa691758606fe044a8b1d74b7bb9bc), [`5d64812`](https://github.com/vertz-dev/vertz/commit/5d6481233006f67c21375f3879fda600c86c0cdd), [`cd8b41b`](https://github.com/vertz-dev/vertz/commit/cd8b41bb9900f364cd562be9ae64b9644096881a), [`180ac91`](https://github.com/vertz-dev/vertz/commit/180ac91f4fbc562581136dd8256f67fcc724fa69), [`6d32565`](https://github.com/vertz-dev/vertz/commit/6d32565c2818f9235d02af14a616279f018d0ff5), [`2e99e39`](https://github.com/vertz-dev/vertz/commit/2e99e3943830d2e2e0b2b44a1b32d8641e63dbe3), [`1c4916b`](https://github.com/vertz-dev/vertz/commit/1c4916b04eaaef0ee2e27eda1b73c36ae24e665e)]:
348
+ - @vertz/ui@0.2.22
349
+ - @vertz/ui-compiler@0.2.22
350
+ - @vertz/core@0.2.22
351
+
352
+ ## 0.2.21
353
+
354
+ ### Patch Changes
355
+
356
+ - [#1345](https://github.com/vertz-dev/vertz/pull/1345) [`0704bbb`](https://github.com/vertz-dev/vertz/commit/0704bbbc5561e2e2a6a6e0fd0a5f6af343f5f178) Thanks [@viniciusdacal](https://github.com/viniciusdacal)! - Adopt `className` as the standard JSX prop for CSS classes, matching React convention. The `class` prop remains as a deprecated alias. All components, examples, and docs updated.
357
+
358
+ - [#1325](https://github.com/vertz-dev/vertz/pull/1325) [`30737c7`](https://github.com/vertz-dev/vertz/commit/30737c73fcf844878b6b781f3b786fac39e6a7b5) Thanks [@viniciusdacal](https://github.com/viniciusdacal)! - Add `dataset` property to SSR DOM shim elements, fixing crashes when components access `el.dataset.*` during SSR
359
+
360
+ - [#1314](https://github.com/vertz-dev/vertz/pull/1314) [`5eda52e`](https://github.com/vertz-dev/vertz/commit/5eda52e2a74966eb94dcca5af00cb1f1dd8c2fd7) Thanks [@viniciusdacal](https://github.com/viniciusdacal)! - Add automatic restart for stale module graph errors (Phase 3). When a stale-graph error is detected, the server and client now auto-trigger a restart without user interaction. Includes restart loop prevention (max 3 auto-restarts within 10s window) with fallback to the manual "Restart Server" button.
361
+
362
+ - [#1310](https://github.com/vertz-dev/vertz/pull/1310) [`0f7b4bc`](https://github.com/vertz-dev/vertz/commit/0f7b4bc228d6ebf294ab9b7a63087324f003cf86) Thanks [@viniciusdacal](https://github.com/viniciusdacal)! - Add stale module graph detection and dev server restart mechanism. When Bun's HMR retains stale import bindings after exports are removed or renamed, the error overlay now shows a "Restart Server" button that triggers a soft server restart, clearing the module graph and recovering automatically.
363
+
364
+ - [#1365](https://github.com/vertz-dev/vertz/pull/1365) [`6be7ce8`](https://github.com/vertz-dev/vertz/commit/6be7ce859300258b926fa7a608e2656952fea0c1) Thanks [@viniciusdacal](https://github.com/viniciusdacal)! - Fix duplicate route components during production hydration with lazy (code-split) routes. RouterView and Outlet now re-enter hydration when lazy routes resolve, claiming SSR nodes instead of recreating DOM. Add route-aware chunk preloading via route-chunk manifest.
365
+
366
+ - [#1396](https://github.com/vertz-dev/vertz/pull/1396) [`2ae15d1`](https://github.com/vertz-dev/vertz/commit/2ae15d116fc58c59a430472a98198377ccde1e4e) Thanks [@viniciusdacal](https://github.com/viniciusdacal)! - feat(ui,ui-server,cli): add generateParams for dynamic route SSG
367
+
368
+ Routes can now define `generateParams` to pre-render dynamic routes at build time. The build pipeline expands these into concrete paths and pre-renders each one to static HTML files.
369
+
370
+ - [#1346](https://github.com/vertz-dev/vertz/pull/1346) [`b5fbc7d`](https://github.com/vertz-dev/vertz/commit/b5fbc7d884b06c8a0cb0c48d22dae5fe2684a4cc) Thanks [@viniciusdacal](https://github.com/viniciusdacal)! - Support React-style `style` objects with camelCase properties. `style={{ backgroundColor: 'red' }}` now converts to a CSS string at all levels: JSX runtime, compiler-generated code, reactive `__attr()` bindings, and SSR. Includes auto-px for dimensional numeric values, unitless property detection, and vendor prefix handling.
371
+
372
+ - Updated dependencies [[`a16511c`](https://github.com/vertz-dev/vertz/commit/a16511cd78256fe86d0d69393dd923353d6f445a), [`796ef1a`](https://github.com/vertz-dev/vertz/commit/796ef1a9826f401c6d0b08f424d53609debda029), [`a5b9cbe`](https://github.com/vertz-dev/vertz/commit/a5b9cbe68202345ab09002f7e42c2a5be0c917bf), [`520444e`](https://github.com/vertz-dev/vertz/commit/520444e3bdbbf3140b75ed3754870166544b5f88), [`0704bbb`](https://github.com/vertz-dev/vertz/commit/0704bbbc5561e2e2a6a6e0fd0a5f6af343f5f178), [`fa3d23c`](https://github.com/vertz-dev/vertz/commit/fa3d23ca2e92a4b734c4908ab274d8e75e45cbc0), [`823e301`](https://github.com/vertz-dev/vertz/commit/823e3016dcb4487a7cdf9af61aea940566ffb21c), [`86d33bd`](https://github.com/vertz-dev/vertz/commit/86d33bd56934d62441b031fb72dd86687f0d0845), [`4390036`](https://github.com/vertz-dev/vertz/commit/4390036144176fab7aa869ddcde621eece6f904c), [`a7e37c3`](https://github.com/vertz-dev/vertz/commit/a7e37c3dd29ac75183a085d34b0621d339f8402a), [`6be7ce8`](https://github.com/vertz-dev/vertz/commit/6be7ce859300258b926fa7a608e2656952fea0c1), [`301c401`](https://github.com/vertz-dev/vertz/commit/301c40192ddec0a306bba997a7f9e4ce4253aa95), [`c9d6c7e`](https://github.com/vertz-dev/vertz/commit/c9d6c7ef368efdc905b4e96302798b2db65522aa), [`cac4e45`](https://github.com/vertz-dev/vertz/commit/cac4e452bd12b726c077ce2f48605bbc410a680f), [`9ccbe74`](https://github.com/vertz-dev/vertz/commit/9ccbe743c3c4eee109b69c9e3aff5df5f64c572e), [`e9cfc6a`](https://github.com/vertz-dev/vertz/commit/e9cfc6ad9b4b5dd5c518bea3c1982082d7e96e10), [`427e519`](https://github.com/vertz-dev/vertz/commit/427e5194a7f783c2accc246409bf146dcfa2f1b7), [`2ae15d1`](https://github.com/vertz-dev/vertz/commit/2ae15d116fc58c59a430472a98198377ccde1e4e), [`b5fbc7d`](https://github.com/vertz-dev/vertz/commit/b5fbc7d884b06c8a0cb0c48d22dae5fe2684a4cc), [`f356523`](https://github.com/vertz-dev/vertz/commit/f356523f7054b1b72d7936e3a7e13147904087dc), [`f9eccd5`](https://github.com/vertz-dev/vertz/commit/f9eccd56b2ecc4467b36b8e78bb3a072141ef93c), [`4079d6b`](https://github.com/vertz-dev/vertz/commit/4079d6b7567479f5f59648e81773f098c7696d02)]:
373
+ - @vertz/ui@0.2.21
374
+ - @vertz/ui-compiler@0.2.21
375
+ - @vertz/core@0.2.21
376
+
377
+ ## 0.2.20
378
+
379
+ ### Patch Changes
380
+
381
+ - [#1281](https://github.com/vertz-dev/vertz/pull/1281) [`9a0a313`](https://github.com/vertz-dev/vertz/commit/9a0a3131656bb22a8cdfb351013c3a7a69cdd553) Thanks [@viniciusdacal](https://github.com/viniciusdacal)! - Add favicon to scaffold template and auto-detect it in the dev server
382
+
383
+ - Updated dependencies []:
384
+ - @vertz/core@0.2.20
385
+ - @vertz/ui@0.2.20
386
+ - @vertz/ui-compiler@0.2.20
387
+
388
+ ## 0.2.19
389
+
390
+ ### Patch Changes
391
+
392
+ - Updated dependencies []:
393
+ - @vertz/core@0.2.19
394
+ - @vertz/ui@0.2.19
395
+ - @vertz/ui-compiler@0.2.19
396
+
397
+ ## 0.2.18
398
+
399
+ ### Patch Changes
400
+
401
+ - Updated dependencies [[`b4cb6b6`](https://github.com/vertz-dev/vertz/commit/b4cb6b6826583c05efcdfd0af0e046a49f6eed91), [`c2355f9`](https://github.com/vertz-dev/vertz/commit/c2355f9d3e13feac615b00d48406e4626e92869b), [`e5ac67e`](https://github.com/vertz-dev/vertz/commit/e5ac67e24a05e0342a8c470ef741d7729ebeaf58)]:
402
+ - @vertz/ui@0.2.18
403
+ - @vertz/core@0.2.18
404
+ - @vertz/ui-compiler@0.2.18
405
+
406
+ ## 0.2.17
407
+
408
+ ### Patch Changes
409
+
410
+ - Updated dependencies [[`f284697`](https://github.com/vertz-dev/vertz/commit/f284697218e3ebcc7a196e8a6633c822e206646e), [`6d6a85c`](https://github.com/vertz-dev/vertz/commit/6d6a85c0fd9f354a8d077e2eb1afdcf065344b95)]:
411
+ - @vertz/ui@0.2.17
412
+ - @vertz/core@0.2.17
413
+ - @vertz/ui-compiler@0.2.17
414
+
415
+ ## 0.2.16
416
+
417
+ ### Patch Changes
418
+
419
+ - [#1108](https://github.com/vertz-dev/vertz/pull/1108) [`97e9fc9`](https://github.com/vertz-dev/vertz/commit/97e9fc9a80548e2be111542513802269162f4136) Thanks [@viniciusdacal](https://github.com/viniciusdacal)! - Add LRU eviction to MemoryCache with configurable maxSize (default 1000) to prevent unbounded cache growth in query().
420
+
421
+ - [#1195](https://github.com/vertz-dev/vertz/pull/1195) [`af0b64c`](https://github.com/vertz-dev/vertz/commit/af0b64c62480606cd9bb7ec9a25d7a4f0903d9cf) Thanks [@viniciusdacal](https://github.com/viniciusdacal)! - Add runtime image optimization for dynamic images at the edge. The `<Image>` component now rewrites absolute HTTP(S) URLs through `/_vertz/image` when `configureImageOptimizer()` is called. The Cloudflare handler supports an `imageOptimizer` config option using `cf.image` for edge transformation. Dev server includes a passthrough proxy for development.
422
+
423
+ - [#1173](https://github.com/vertz-dev/vertz/pull/1173) [`caf4647`](https://github.com/vertz-dev/vertz/commit/caf464741b53fdd65be1c558cf2330172f6d2feb) Thanks [@viniciusdacal](https://github.com/viniciusdacal)! - Add optional onMiss telemetry callback to FieldSelectionTracker for compiler miss detection, and recordFieldMiss method to DiagnosticsCollector for surfacing misses via /\_\_vertz_diagnostics endpoint
424
+
425
+ - [#1170](https://github.com/vertz-dev/vertz/pull/1170) [`6c33552`](https://github.com/vertz-dev/vertz/commit/6c3355265cd072d2c5b3d41c3c60e76d75c6e21c) Thanks [@viniciusdacal](https://github.com/viniciusdacal)! - Add automatic font fallback metric overrides for zero-CLS font loading. The framework now extracts font metrics from .woff2 files at server startup and generates adjusted fallback @font-face blocks with ascent-override, descent-override, line-gap-override, and size-adjust. This eliminates layout shift when custom fonts load with font-display: swap.
426
+
427
+ - [#1168](https://github.com/vertz-dev/vertz/pull/1168) [`d0e9dc5`](https://github.com/vertz-dev/vertz/commit/d0e9dc5065fea630cd046ef55f279fe9fb400086) Thanks [@viniciusdacal](https://github.com/viniciusdacal)! - feat(ui): Image component with build-time optimization
428
+
429
+ Add `<Image>` component to `@vertz/ui` that renders an `<img>` element with sensible defaults (lazy loading, async decoding). At build time, the Bun plugin detects static `<Image>` usage and replaces it with optimized `<picture>` markup containing WebP 1x/2x variants and an original-format fallback.
430
+
431
+ - Runtime `<Image>` component with priority prop, pass-through attributes
432
+ - AST-based transform using ts-morph for reliable detection
433
+ - Sharp-based image processor with content-hash caching
434
+ - `/__vertz_img/` route for serving optimized images with path traversal protection
435
+ - HTML attribute escaping to prevent XSS in generated markup
436
+
437
+ - [#1109](https://github.com/vertz-dev/vertz/pull/1109) [`e1938b0`](https://github.com/vertz-dev/vertz/commit/e1938b0f86129396d22f5db57792cfa805387e62) Thanks [@viniciusdacal](https://github.com/viniciusdacal)! - Add incremental HMR manifest updates — regenerate changed file's reactivity manifest on save before SSR re-import, with change detection to skip unnecessary cache invalidation
438
+
439
+ - [#1193](https://github.com/vertz-dev/vertz/pull/1193) [`02bac2a`](https://github.com/vertz-dev/vertz/commit/02bac2af689750d500f0846d700e89528a02627d) Thanks [@viniciusdacal](https://github.com/viniciusdacal)! - Add automatic route code splitting: `defineRoutes()` component factories are rewritten to lazy `import()` calls at build time, enabling per-page code splitting without manual dynamic imports.
440
+
441
+ - [#1131](https://github.com/vertz-dev/vertz/pull/1131) [`ab3f364`](https://github.com/vertz-dev/vertz/commit/ab3f36478018245cc9473217a9a3bf7b04c6a5cb) Thanks [@viniciusdacal](https://github.com/viniciusdacal)! - Export EntitySchemaManifest, EntitySchemaManifestEntry, and EntitySchemaRelation types from @vertz/codegen. Update @vertz/ui-server to import from the canonical source instead of maintaining duplicate definitions.
442
+
443
+ - [#1176](https://github.com/vertz-dev/vertz/pull/1176) [`0f6d90a`](https://github.com/vertz-dev/vertz/commit/0f6d90adf785c52ff1e70187e3479941b2db896c) Thanks [@viniciusdacal](https://github.com/viniciusdacal)! - SSR delivery optimizations: consolidate CSS into max 3 style tags, add structured PreloadItem data for HTTP Link headers, support modulepreload injection and Cache-Control headers in SSR handler.
444
+
445
+ - [#1220](https://github.com/vertz-dev/vertz/pull/1220) [`d8257a5`](https://github.com/vertz-dev/vertz/commit/d8257a5665704fa0f2c2e6646f3b5ab8c39c5cdc) Thanks [@viniciusdacal](https://github.com/viniciusdacal)! - Add `isBrowser()` SSR detection utility and migrate all `typeof window/document` guards. Remove `addEventListener`/`removeEventListener` no-op stubs from the SSR DOM shim — browser-only code no longer runs during SSR.
446
+
447
+ - [#1216](https://github.com/vertz-dev/vertz/pull/1216) [`c1c0638`](https://github.com/vertz-dev/vertz/commit/c1c06383b8ad50c833b64aa5009fe7b494bb559b) Thanks [@viniciusdacal](https://github.com/viniciusdacal)! - SSR session injection to eliminate auth loading flash. JWT session data is now injected as `window.__VERTZ_SESSION__` during SSR, so `AuthProvider` hydrates with session data immediately instead of showing a loading state. Zero-config: the CLI auto-wires the session resolver when auth is configured.
448
+
449
+ - Updated dependencies [[`97e9fc9`](https://github.com/vertz-dev/vertz/commit/97e9fc9a80548e2be111542513802269162f4136), [`d2f6baf`](https://github.com/vertz-dev/vertz/commit/d2f6baf560db958f56257879d5d69da200ed519d), [`24b81a2`](https://github.com/vertz-dev/vertz/commit/24b81a26f0064863c1e50cdd17c0fe0fc022f6ea), [`af0b64c`](https://github.com/vertz-dev/vertz/commit/af0b64c62480606cd9bb7ec9a25d7a4f0903d9cf), [`caf4647`](https://github.com/vertz-dev/vertz/commit/caf464741b53fdd65be1c558cf2330172f6d2feb), [`b061fc4`](https://github.com/vertz-dev/vertz/commit/b061fc4d04e851ae1ec6addd9342cec7b1a698f8), [`d44234d`](https://github.com/vertz-dev/vertz/commit/d44234de726d5dfa786103b3e5a311754753f08e), [`6c33552`](https://github.com/vertz-dev/vertz/commit/6c3355265cd072d2c5b3d41c3c60e76d75c6e21c), [`d0e9dc5`](https://github.com/vertz-dev/vertz/commit/d0e9dc5065fea630cd046ef55f279fe9fb400086), [`9f6f292`](https://github.com/vertz-dev/vertz/commit/9f6f292137d89064c1d86c2231e1f416fa1abd61), [`02bac2a`](https://github.com/vertz-dev/vertz/commit/02bac2af689750d500f0846d700e89528a02627d), [`0f6d90a`](https://github.com/vertz-dev/vertz/commit/0f6d90adf785c52ff1e70187e3479941b2db896c), [`d8257a5`](https://github.com/vertz-dev/vertz/commit/d8257a5665704fa0f2c2e6646f3b5ab8c39c5cdc)]:
450
+ - @vertz/ui@0.2.16
451
+ - @vertz/ui-compiler@0.2.16
452
+ - @vertz/core@0.2.16
453
+
454
+ ## 0.2.15
455
+
456
+ ### Patch Changes
457
+
458
+ - Updated dependencies [[`4a2d5b5`](https://github.com/vertz-dev/vertz/commit/4a2d5b504791ee772396248789b9ad65bd078abf), [`d0f0941`](https://github.com/vertz-dev/vertz/commit/d0f09419950bd0d6d9229a11fa9bf07f632fb85d)]:
459
+ - @vertz/ui@0.2.15
460
+ - @vertz/core@0.2.15
461
+ - @vertz/ui-compiler@0.2.15
462
+
463
+ ## 0.2.14
464
+
465
+ ### Patch Changes
466
+
467
+ - Updated dependencies []:
468
+ - @vertz/core@0.2.14
469
+ - @vertz/ui@0.2.14
470
+ - @vertz/ui-compiler@0.2.14
471
+
472
+ ## 0.2.13
473
+
474
+ ### Patch Changes
475
+
476
+ - [#1046](https://github.com/vertz-dev/vertz/pull/1046) [`337e1b3`](https://github.com/vertz-dev/vertz/commit/337e1b3dfca6768575e57cf54069beb4f37366b7) Thanks [@viniciusdacal](https://github.com/viniciusdacal)! - Access Set Bootstrap + Client-Side can(): server computes global entitlement snapshots (computeAccessSet), embeds in JWT acl claim with 2KB overflow strategy, exposes GET /api/auth/access-set with ETag/304 support. Client-side can() function returns reactive AccessCheck signals, AccessGate blocks UI while loading, createAccessProvider hydrates from SSR-injected **VERTZ_ACCESS_SET**. computeEntityAccess() enables per-entity access metadata for can(entitlement, entity). Compiler recognizes can() as signal-api via reactivity manifest.
477
+
478
+ - [#950](https://github.com/vertz-dev/vertz/pull/950) [`a5ceec8`](https://github.com/vertz-dev/vertz/commit/a5ceec812613d92f7261407e86b1a39993687a7a) Thanks [@viniciusdacal](https://github.com/viniciusdacal)! - Automatic optimistic updates for entity mutations.
479
+
480
+ EntityStore gains an optimistic layer stack (applyLayer/commitLayer/rollbackLayer) that overlays in-flight mutation patches on top of server-truth base data. MutationDescriptor in @vertz/fetch orchestrates the apply→fetch→commit/rollback lifecycle. The query() source switcher reads entity-backed data from EntityStore, so optimistic patches propagate reactively to all consuming queries. Generated createClient auto-wires the handler — zero boilerplate for `await api.todos.update(id, { completed: true })` to optimistically update all queries immediately.
481
+
482
+ - [#1052](https://github.com/vertz-dev/vertz/pull/1052) [`4eac71c`](https://github.com/vertz-dev/vertz/commit/4eac71c98369d12a0cd7a3cbbeda60ea7cc5bd05) Thanks [@viniciusdacal](https://github.com/viniciusdacal)! - Add client-side auth session management (AuthProvider, useAuth, AuthGate)
483
+
484
+ - AuthProvider wraps app with auth context, manages JWT session lifecycle
485
+ - useAuth() returns reactive state + SdkMethods (signIn, signUp, signOut, mfaChallenge, forgotPassword, resetPassword)
486
+ - SdkMethods work with form() for automatic validation and submission
487
+ - Proactive token refresh scheduling (10s before expiry, tab visibility, online/offline handling)
488
+ - AuthGate gates rendering on auth state resolution (shows fallback during loading)
489
+ - SSR hydration via window.**VERTZ_SESSION** (no initial fetch needed)
490
+ - AccessContext integration: AuthProvider auto-manages access set when accessControl=true
491
+ - Server: signin/signup/refresh responses now include expiresAt timestamp
492
+
493
+ - Updated dependencies [[`337e1b3`](https://github.com/vertz-dev/vertz/commit/337e1b3dfca6768575e57cf54069beb4f37366b7), [`a5ceec8`](https://github.com/vertz-dev/vertz/commit/a5ceec812613d92f7261407e86b1a39993687a7a), [`3a79c2f`](https://github.com/vertz-dev/vertz/commit/3a79c2fad5bfbaed61f252cf2b908592e12a82bd), [`a9211ca`](https://github.com/vertz-dev/vertz/commit/a9211ca751305f541987b93d493d349838cf4822), [`a82b2ec`](https://github.com/vertz-dev/vertz/commit/a82b2ec1ccc94f278916796783c33d81ffead211), [`1011e51`](https://github.com/vertz-dev/vertz/commit/1011e51fbfe528e35930e3dd5c32b76568b0684a), [`de34f8d`](https://github.com/vertz-dev/vertz/commit/de34f8dc9d3e69b507874f33d80bf7dc4420001d), [`4eac71c`](https://github.com/vertz-dev/vertz/commit/4eac71c98369d12a0cd7a3cbbeda60ea7cc5bd05)]:
494
+ - @vertz/ui@0.2.13
495
+ - @vertz/ui-compiler@0.2.13
496
+ - @vertz/core@0.2.13
497
+
498
+ ## 0.2.12
499
+
500
+ ### Patch Changes
501
+
502
+ - [#937](https://github.com/vertz-dev/vertz/pull/937) [`c7e3ec2`](https://github.com/vertz-dev/vertz/commit/c7e3ec2e926b0a2cd6d35f58124f3d7f50fc6fb9) Thanks [@viniciusdacal](https://github.com/viniciusdacal)! - Fix nested conditional DOM duplication and stable context IDs for HMR.
503
+
504
+ Nested `__conditional` calls (from chained ternaries) returned DocumentFragments that lost children after DOM insertion, causing stale text nodes. `normalizeNode()` now wraps fragments in `<span style="display:contents">` for stable parent references.
505
+
506
+ Framework-internal contexts (`RouterContext`, `OutletContext`, `DialogStackContext`) now have stable IDs so they survive HMR module re-evaluation without breaking `useContext()`.
507
+
508
+ - Updated dependencies [[`c7e3ec2`](https://github.com/vertz-dev/vertz/commit/c7e3ec2e926b0a2cd6d35f58124f3d7f50fc6fb9)]:
509
+ - @vertz/ui@0.2.12
510
+ - @vertz/core@0.2.12
511
+ - @vertz/ui-compiler@0.2.12
512
+
513
+ ## 0.2.11
514
+
515
+ ### Patch Changes
516
+
517
+ - [#919](https://github.com/vertz-dev/vertz/pull/919) [`b2878cf`](https://github.com/vertz-dev/vertz/commit/b2878cfe2acb3d1155ca5e0da13b2ee91c9aea9a) Thanks [@viniciusdacal](https://github.com/viniciusdacal)! - Fix source map line offset in dev server
518
+
519
+ Breakpoints in browser DevTools were landing 2-3 lines below the intended position. The Bun plugin prepends CSS import and Fast Refresh preamble lines before the compiled code, but the source map was not adjusted for these extra lines. Now the source map mappings are offset by the number of prepended lines, so breakpoints land on the correct line.
520
+
521
+ - [#917](https://github.com/vertz-dev/vertz/pull/917) [`5ed4c1a`](https://github.com/vertz-dev/vertz/commit/5ed4c1a4c5c9ea946e97b1636011251c6287eaf4) Thanks [@viniciusdacal](https://github.com/viniciusdacal)! - Fix HMR fast-refresh stability: SSR module reload now uses .ts wrapper to preserve plugin processing, compiler unwraps NonNullExpression in reactivity analyzer, and dev server includes diagnostic logging (VERTZ_DEBUG) and health check endpoint (/\_\_vertz_diagnostics).
522
+
523
+ - [#918](https://github.com/vertz-dev/vertz/pull/918) [`1fc9e33`](https://github.com/vertz-dev/vertz/commit/1fc9e33a9aa5283898c8974084f519a3caacbabb) Thanks [@viniciusdacal](https://github.com/viniciusdacal)! - Remove index.html from the framework
524
+
525
+ UI apps no longer require an `index.html` file in the project root. The production build now generates the HTML shell programmatically with the correct asset references, eliminating the need for:
526
+
527
+ - Manual `index.html` maintenance
528
+ - Fast Refresh runtime stripping during build
529
+ - Dev script tag replacement with hashed entries
530
+ - `./public/` path rewriting
531
+
532
+ The `createIndexHtmlStasher` dev server mechanism (which renamed `index.html` during development to prevent Bun from auto-serving it) has been removed entirely.
533
+
534
+ `UIBuildConfig` gains an optional `title` field (default: `'Vertz App'`) to set the HTML page title.
535
+
536
+ - Updated dependencies [[`275e4c7`](https://github.com/vertz-dev/vertz/commit/275e4c770f55b9e75b44d90f2cb586fff3eaeede), [`5ed4c1a`](https://github.com/vertz-dev/vertz/commit/5ed4c1a4c5c9ea946e97b1636011251c6287eaf4), [`5607c59`](https://github.com/vertz-dev/vertz/commit/5607c598c1c55485222fa2da192d0e0321f8b14a), [`523bbcb`](https://github.com/vertz-dev/vertz/commit/523bbcb12c1866a8334d5dac278cb51b157a5c7b), [`5607c59`](https://github.com/vertz-dev/vertz/commit/5607c598c1c55485222fa2da192d0e0321f8b14a), [`859e3da`](https://github.com/vertz-dev/vertz/commit/859e3dae660629d5d4f1e13c305c9201ee1d738d)]:
537
+ - @vertz/ui-compiler@0.2.11
538
+ - @vertz/ui@0.2.11
539
+ - @vertz/core@0.2.11
540
+
541
+ ## 0.2.8
542
+
543
+ ### Patch Changes
544
+
545
+ - Updated dependencies []:
546
+ - @vertz/core@0.2.8
547
+ - @vertz/ui@0.2.8
548
+ - @vertz/ui-compiler@0.2.8
549
+
550
+ ## 0.2.7
551
+
552
+ ### Patch Changes
553
+
554
+ - Updated dependencies []:
555
+ - @vertz/core@0.2.7
556
+ - @vertz/ui@0.2.7
557
+ - @vertz/ui-compiler@0.2.7
558
+
559
+ ## 0.2.6
560
+
561
+ ### Patch Changes
562
+
563
+ - Updated dependencies []:
564
+ - @vertz/core@0.2.6
565
+ - @vertz/ui@0.2.6
566
+ - @vertz/ui-compiler@0.2.6
567
+
568
+ ## 0.2.5
569
+
570
+ ### Patch Changes
571
+
572
+ - Updated dependencies []:
573
+ - @vertz/core@0.2.5
574
+ - @vertz/ui@0.2.5
575
+ - @vertz/ui-compiler@0.2.5
576
+
577
+ ## 0.2.4
578
+
579
+ ### Patch Changes
580
+
581
+ - [#894](https://github.com/vertz-dev/vertz/pull/894) [`a986d07`](https://github.com/vertz-dev/vertz/commit/a986d0788ca0210dfa4f624153d4bda72257a78c) Thanks [@viniciusdacal](https://github.com/viniciusdacal)! - Fix HMR fast-refresh stability: SSR module reload now uses .ts wrapper to preserve plugin processing, compiler unwraps NonNullExpression in reactivity analyzer, and dev server includes diagnostic logging (VERTZ_DEBUG) and health check endpoint (/\_\_vertz_diagnostics).
582
+
583
+ - Updated dependencies [[`a986d07`](https://github.com/vertz-dev/vertz/commit/a986d0788ca0210dfa4f624153d4bda72257a78c)]:
584
+ - @vertz/ui-compiler@0.2.4
585
+ - @vertz/core@0.2.4
586
+ - @vertz/ui@0.2.2
587
+
588
+ ## 0.2.3
589
+
590
+ ### Patch Changes
591
+
592
+ - [#880](https://github.com/vertz-dev/vertz/pull/880) [`2e86c55`](https://github.com/vertz-dev/vertz/commit/2e86c55e3c04f3c534bf0dc124d18dcdc5d9eefc) Thanks [@viniciusdacal](https://github.com/viniciusdacal)! - Preserve DOM state (form values, focus, scroll positions) across fast refresh hot updates. Previously, `replaceChild` created an entirely new DOM tree, losing transient state like input values, cursor position, and scroll offsets. Now captures state by `name`/`id` attributes before replacement and restores it after.
593
+
594
+ - [#878](https://github.com/vertz-dev/vertz/pull/878) [`62dddcb`](https://github.com/vertz-dev/vertz/commit/62dddcbcb4943b12a04bca8466b09ae21901070b) Thanks [@viniciusdacal](https://github.com/viniciusdacal)! - Remove `private: true` so the package is published to npm. Required by `@vertz/cli` at runtime.
595
+
596
+ - Updated dependencies [[`62dddcb`](https://github.com/vertz-dev/vertz/commit/62dddcbcb4943b12a04bca8466b09ae21901070b), [`62dddcb`](https://github.com/vertz-dev/vertz/commit/62dddcbcb4943b12a04bca8466b09ae21901070b), [`b0b6115`](https://github.com/vertz-dev/vertz/commit/b0b6115e0389447ffb951e875b5ce224e4ace51c)]:
597
+ - @vertz/core@0.2.3
598
+ - @vertz/ui-compiler@0.2.3
599
+ - @vertz/ui@0.2.2
600
+
601
+ ## 0.2.2
602
+
603
+ ### Patch Changes
604
+
605
+ - Updated dependencies [[`b6cb0a0`](https://github.com/vertz-dev/vertz/commit/b6cb0a0e3de68974ce1747063288aef7a199f084)]:
606
+ - @vertz/ui@0.2.2
607
+ - @vertz/ui-compiler@0.2.2
608
+ - @vertz/core@0.2.2
609
+
610
+ ## 0.2.0
611
+
612
+ ### Minor Changes
613
+
614
+ - [#267](https://github.com/vertz-dev/vertz/pull/267) [`0a33c14`](https://github.com/vertz-dev/vertz/commit/0a33c142a12a54e0da61423701ca338118ab9c98) Thanks [@vertz-dev-core](https://github.com/apps/vertz-dev-core)! - Zero-config SSR: `vertz({ ssr: true })` makes `vite dev` serve SSR'd HTML automatically.
615
+
616
+ **@vertz/ui-server:**
617
+
618
+ - Add `@vertz/ui-server/dom-shim` subpath with SSRElement, installDomShim, toVNode
619
+ - Add `@vertz/ui-server/jsx-runtime` subpath for server-side JSX rendering
620
+
621
+ **@vertz/ui-compiler:**
622
+
623
+ - Add `ssr: boolean | SSROptions` to vertzPlugin options
624
+ - Add `configureServer` hook that intercepts HTML requests and renders SSR'd HTML
625
+ - Auto-generate virtual SSR entry module (`\0vertz:ssr-entry`)
626
+ - Handle JSX runtime alias swap for SSR builds
627
+
628
+ **@vertz/ui:**
629
+
630
+ - Add `@vertz/ui/jsx-runtime` and `@vertz/ui/jsx-dev-runtime` subpath exports
631
+ - Make router SSR-compatible (auto-detect `__SSR_URL__`, skip popstate in SSR)
632
+
633
+ ### Patch Changes
634
+
635
+ - [#199](https://github.com/vertz-dev/vertz/pull/199) [`63f074e`](https://github.com/vertz-dev/vertz/commit/63f074eefa96b49eb72724f8ec377a14a1f2c630) Thanks [@vertz-tech-lead](https://github.com/apps/vertz-tech-lead)! - Initial release of @vertz/ui v0.1 — a compiler-driven reactive UI framework.
636
+
637
+ - Reactivity: `signal()`, `computed()`, `effect()`, `batch()`, `untrack()`
638
+ - Compiler: `let` → signal, `const` derived → computed, JSX → DOM helpers, mutation → peek/notify
639
+ - Component model: `ref()`, `onMount()`, `onCleanup()`, `watch()`, `children()`, `createContext()`
640
+ - Error handling: `ErrorBoundary`, `Suspense` with async support
641
+ - CSS-in-JS: `css()` with type-safe properties, `variants()`, `globalCss()`, `s()` shorthand
642
+ - Theming: `defineTheme()`, `ThemeProvider`, CSS variable generation
643
+ - Zero-runtime CSS extraction via compiler plugin
644
+ - Forms: `form()` with schema validation, `formDataToObject()`, SDK method integration
645
+ - Data fetching: `query()` with caching, `MemoryCache`, key derivation
646
+ - SSR: `renderToStream()`, `serializeToHtml()`, `HeadCollector` for streaming HTML
647
+ - Hydration: `hydrate()` with eager/lazy/interaction strategies, component registry
648
+ - Router: `defineRoutes()`, `createRouter()`, `createLink()`, `createOutlet()`, search params
649
+ - Primitives: 15 headless components (Button, Dialog, Select, Menu, Tabs, Accordion, etc.)
650
+ - Testing: `renderTest()`, `findByText()`, `click()`, `type()`, `press()`, `createTestRouter()`
651
+ - Vite plugin: HMR, CSS extraction, codegen watch mode
652
+ - Curated public API: developer-facing exports in main barrel, compiler internals in `@vertz/ui/internals`
653
+
654
+ - Updated dependencies [[`a207936`](https://github.com/vertz-dev/vertz/commit/a2079362c54a8b61ea2368039abcb08681448380), [`b2d43d4`](https://github.com/vertz-dev/vertz/commit/b2d43d4f265e4b1a806b3e96f00721cc38cc07e8), [`c8efe6b`](https://github.com/vertz-dev/vertz/commit/c8efe6b4aef9ea9b9b4e3de414297ce2f829f7bb), [`3407afd`](https://github.com/vertz-dev/vertz/commit/3407afdf543481cd559e550454144d16e6a26e06), [`4f780bb`](https://github.com/vertz-dev/vertz/commit/4f780bba6bee7a493c9a1e0b8463ea2126a7285b), [`0a33c14`](https://github.com/vertz-dev/vertz/commit/0a33c142a12a54e0da61423701ca338118ab9c98), [`c1e38d0`](https://github.com/vertz-dev/vertz/commit/c1e38d010da1bea95ed9246968fabc22e300a6e9), [`0f1c028`](https://github.com/vertz-dev/vertz/commit/0f1c028dd6bb90e37ac71f60e40ba0be774cca11), [`7207c4c`](https://github.com/vertz-dev/vertz/commit/7207c4c44c2fc83f67459cbcba8e6010b4d05145), [`a454791`](https://github.com/vertz-dev/vertz/commit/a454791e0c6866cbad1d0d96bc3c0688282b021b), [`e17ccb2`](https://github.com/vertz-dev/vertz/commit/e17ccb261ecebc1ca7d58b75365869cb29253a3c), [`948f127`](https://github.com/vertz-dev/vertz/commit/948f127bf4b752274800c045d010590f1cc266d8), [`9ee0308`](https://github.com/vertz-dev/vertz/commit/9ee03084f71803b04eef5f05ced2f90b52a9fa8e), [`63f074e`](https://github.com/vertz-dev/vertz/commit/63f074eefa96b49eb72724f8ec377a14a1f2c630)]:
655
+ - @vertz/core@0.2.0
656
+ - @vertz/server@0.2.0
657
+ - @vertz/ui@0.2.0
658
+
659
+ ## 0.1.0 (2026-02-13)
660
+
661
+ ### Features
662
+
663
+ - **SSR Core:** Initial server-side rendering implementation
664
+
665
+ - `renderToStream()` — Streaming HTML renderer returning `ReadableStream<Uint8Array>`
666
+ - Component-to-HTML serialization with proper escaping
667
+ - Void element handling (no closing tags for `<input>`, `<br>`, etc.)
668
+ - Raw text element handling (`<script>`, `<style>` content not escaped)
669
+
670
+ - **Out-of-Order Streaming:** Suspense boundary support
671
+
672
+ - Slot placeholders (`v-slot-N`) for async content
673
+ - Template chunks (`v-tmpl-N`) streamed when data resolves
674
+ - Client-side replacement scripts with DOM manipulation
675
+
676
+ - **Hydration Markers:** Atomic component hydration
677
+
678
+ - `data-v-id` attributes for component identification
679
+ - `data-v-key` for unique instance tracking
680
+ - Serialized props embedded as `<script type="application/json">`
681
+ - Static components produce zero hydration markers
682
+
683
+ - **Head Management:** `<head>` metadata collection
684
+
685
+ - `HeadCollector` for collecting `<title>`, `<meta>`, `<link>` during render
686
+ - `renderHeadToHtml()` for serializing head entries
687
+
688
+ - **Asset Pipeline:** Script and stylesheet injection
689
+
690
+ - `renderAssetTags()` for generating `<script>` and `<link>` tags
691
+ - Support for `async` and `defer` attributes on scripts
692
+
693
+ - **Critical CSS:** Above-the-fold CSS inlining
694
+
695
+ - `inlineCriticalCss()` with injection prevention
696
+ - Escapes `</style>` sequences to prevent breakout
697
+
698
+ - **CSP Nonce Support:** Content Security Policy compliance
699
+
700
+ - Optional `nonce` parameter on `renderToStream()`
701
+ - All inline scripts include `nonce` attribute when provided
702
+ - Nonce value escaping to prevent attribute injection
703
+
704
+ - **Testing Utilities:** SSR testing helpers
705
+ - `streamToString()` — Convert stream to string for assertions
706
+ - `collectStreamChunks()` — Collect chunks as array for ordering tests
707
+ - `encodeChunk()` — UTF-8 encoding helper
708
+
709
+ ### Test Coverage
710
+
711
+ - 66 tests across 10 test files
712
+ - 5 integration tests validating all acceptance criteria (IT-5A-1 through IT-5A-5)
713
+ - CSP nonce security tests
714
+ - Streaming chunk ordering tests
715
+ - Hydration marker tests for interactive vs static components
716
+ - Edge case handling (empty trees, void elements, raw text elements)
717
+
718
+ ### Documentation
719
+
720
+ - Comprehensive README with usage examples
721
+ - API reference for all public exports
722
+ - Security guidance for `rawHtml()` usage
723
+ - Examples for Suspense streaming, hydration markers, head management, asset injection, and critical CSS
@@ -2060,11 +2060,50 @@ class SSRElement extends SSRNode {
2060
2060
  set name(value) {
2061
2061
  this.attrs.name = value;
2062
2062
  }
2063
+ _selectValue;
2063
2064
  get value() {
2065
+ if (this.tag === "select") {
2066
+ return this._selectValue ?? "";
2067
+ }
2064
2068
  return this.attrs.value ?? "";
2065
2069
  }
2066
2070
  set value(value) {
2067
- this.attrs.value = value;
2071
+ if (this.tag === "select") {
2072
+ this._selectValue = value;
2073
+ this._applySelectValue();
2074
+ } else {
2075
+ this.attrs.value = value;
2076
+ }
2077
+ }
2078
+ _applySelectValue() {
2079
+ if (this._selectValue === undefined)
2080
+ return;
2081
+ this._applySelectValueToChildren(this.children);
2082
+ }
2083
+ _applySelectValueToChildren(children) {
2084
+ for (const child of children) {
2085
+ if (child instanceof SSRElement) {
2086
+ if (child.tag === "option") {
2087
+ const optValue = child.attrs.value ?? this._getChildTextContent(child);
2088
+ if (optValue === this._selectValue) {
2089
+ child.attrs.selected = "";
2090
+ } else {
2091
+ delete child.attrs.selected;
2092
+ }
2093
+ } else if (child.tag === "optgroup") {
2094
+ this._applySelectValueToChildren(child.children);
2095
+ }
2096
+ }
2097
+ }
2098
+ }
2099
+ _getChildTextContent(el) {
2100
+ return el.children.map((c) => {
2101
+ if (typeof c === "string")
2102
+ return c;
2103
+ if (c instanceof SSRElement)
2104
+ return this._getChildTextContent(c);
2105
+ return "";
2106
+ }).join("");
2068
2107
  }
2069
2108
  get src() {
2070
2109
  return this.attrs.src ?? "";
@@ -2135,9 +2174,14 @@ class SSRElement extends SSRNode {
2135
2174
  addEventListener(_event, _handler) {}
2136
2175
  removeEventListener(_event, _handler) {}
2137
2176
  toVNode() {
2177
+ let attrs = { ...this.attrs };
2178
+ if (this.tag === "select") {
2179
+ this._applySelectValue();
2180
+ delete attrs.value;
2181
+ }
2138
2182
  return {
2139
2183
  tag: this.tag,
2140
- attrs: { ...this.attrs },
2184
+ attrs,
2141
2185
  children: this.children.map((child) => {
2142
2186
  if (typeof child === "string") {
2143
2187
  return this._innerHTML != null ? rawHtml(child) : child;
@@ -113,8 +113,15 @@ declare class SSRElement extends SSRNode {
113
113
  set type(value: string);
114
114
  get name(): string;
115
115
  set name(value: string);
116
+ /** Internal storage for select.value (not serialized as an attribute). */
117
+ private _selectValue;
116
118
  get value(): string;
117
119
  set value(value: string);
120
+ /** Walk <option> children and set/remove "selected" to match _selectValue. */
121
+ private _applySelectValue;
122
+ private _applySelectValueToChildren;
123
+ /** Get concatenated text content of an element's children. */
124
+ private _getChildTextContent;
118
125
  get src(): string;
119
126
  set src(value: string);
120
127
  get alt(): string;
@@ -7,7 +7,7 @@ import {
7
7
  installDomShim,
8
8
  removeDomShim,
9
9
  toVNode
10
- } from "../shared/chunk-szvdd1qq.js";
10
+ } from "../shared/chunk-bp1ez7v4.js";
11
11
  import"../shared/chunk-bt1px3c4.js";
12
12
  export {
13
13
  toVNode,
package/dist/index.js CHANGED
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  createSSRHandler,
3
3
  loadAotManifest
4
- } from "./shared/chunk-91eg6dps.js";
4
+ } from "./shared/chunk-nstzxw4e.js";
5
5
  import {
6
6
  createNodeHandler
7
- } from "./shared/chunk-1hjzk64k.js";
7
+ } from "./shared/chunk-x8r5mh0q.js";
8
8
  import {
9
9
  clearRouteCssCache,
10
10
  collectStreamChunks,
@@ -34,7 +34,7 @@ import {
34
34
  ssrStreamNavQueries,
35
35
  streamToString,
36
36
  toPrefetchSession
37
- } from "./shared/chunk-j9z9r179.js";
37
+ } from "./shared/chunk-c22cgv96.js";
38
38
  import {
39
39
  clearGlobalSSRTimeout,
40
40
  createSSRAdapter,
@@ -46,7 +46,7 @@ import {
46
46
  registerSSRQuery,
47
47
  setGlobalSSRTimeout,
48
48
  ssrStorage
49
- } from "./shared/chunk-szvdd1qq.js";
49
+ } from "./shared/chunk-bp1ez7v4.js";
50
50
  import {
51
51
  __commonJS,
52
52
  __require,
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  createNodeHandler
3
- } from "./shared/chunk-1hjzk64k.js";
4
- import"./shared/chunk-j9z9r179.js";
5
- import"./shared/chunk-szvdd1qq.js";
3
+ } from "./shared/chunk-x8r5mh0q.js";
4
+ import"./shared/chunk-c22cgv96.js";
5
+ import"./shared/chunk-bp1ez7v4.js";
6
6
  import"./shared/chunk-bt1px3c4.js";
7
7
  export {
8
8
  createNodeHandler
@@ -424,11 +424,50 @@ class SSRElement extends SSRNode {
424
424
  set name(value) {
425
425
  this.attrs.name = value;
426
426
  }
427
+ _selectValue;
427
428
  get value() {
429
+ if (this.tag === "select") {
430
+ return this._selectValue ?? "";
431
+ }
428
432
  return this.attrs.value ?? "";
429
433
  }
430
434
  set value(value) {
431
- this.attrs.value = value;
435
+ if (this.tag === "select") {
436
+ this._selectValue = value;
437
+ this._applySelectValue();
438
+ } else {
439
+ this.attrs.value = value;
440
+ }
441
+ }
442
+ _applySelectValue() {
443
+ if (this._selectValue === undefined)
444
+ return;
445
+ this._applySelectValueToChildren(this.children);
446
+ }
447
+ _applySelectValueToChildren(children) {
448
+ for (const child of children) {
449
+ if (child instanceof SSRElement) {
450
+ if (child.tag === "option") {
451
+ const optValue = child.attrs.value ?? this._getChildTextContent(child);
452
+ if (optValue === this._selectValue) {
453
+ child.attrs.selected = "";
454
+ } else {
455
+ delete child.attrs.selected;
456
+ }
457
+ } else if (child.tag === "optgroup") {
458
+ this._applySelectValueToChildren(child.children);
459
+ }
460
+ }
461
+ }
462
+ }
463
+ _getChildTextContent(el) {
464
+ return el.children.map((c) => {
465
+ if (typeof c === "string")
466
+ return c;
467
+ if (c instanceof SSRElement)
468
+ return this._getChildTextContent(c);
469
+ return "";
470
+ }).join("");
432
471
  }
433
472
  get src() {
434
473
  return this.attrs.src ?? "";
@@ -499,9 +538,14 @@ class SSRElement extends SSRNode {
499
538
  addEventListener(_event, _handler) {}
500
539
  removeEventListener(_event, _handler) {}
501
540
  toVNode() {
541
+ let attrs = { ...this.attrs };
542
+ if (this.tag === "select") {
543
+ this._applySelectValue();
544
+ delete attrs.value;
545
+ }
502
546
  return {
503
547
  tag: this.tag,
504
- attrs: { ...this.attrs },
548
+ attrs,
505
549
  children: this.children.map((child) => {
506
550
  if (typeof child === "string") {
507
551
  return this._innerHTML != null ? rawHtml(child) : child;
@@ -6,7 +6,7 @@ import {
6
6
  setGlobalSSRTimeout,
7
7
  ssrStorage,
8
8
  toVNode
9
- } from "./chunk-szvdd1qq.js";
9
+ } from "./chunk-bp1ez7v4.js";
10
10
 
11
11
  // src/html-serializer.ts
12
12
  var VOID_ELEMENTS = new Set([
@@ -12,7 +12,7 @@ import {
12
12
  ssrRenderSinglePass,
13
13
  ssrStreamNavQueries,
14
14
  toPrefetchSession
15
- } from "./chunk-j9z9r179.js";
15
+ } from "./chunk-c22cgv96.js";
16
16
 
17
17
  // src/aot-manifest-loader.ts
18
18
  import { existsSync, readFileSync } from "node:fs";
@@ -11,7 +11,7 @@ import {
11
11
  ssrRenderSinglePass,
12
12
  ssrStreamNavQueries,
13
13
  toPrefetchSession
14
- } from "./chunk-j9z9r179.js";
14
+ } from "./chunk-c22cgv96.js";
15
15
 
16
16
  // src/node-handler.ts
17
17
  function createNodeHandler(options) {
package/dist/ssr/index.js CHANGED
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  createSSRHandler,
3
3
  loadAotManifest
4
- } from "../shared/chunk-91eg6dps.js";
4
+ } from "../shared/chunk-nstzxw4e.js";
5
5
  import {
6
6
  injectIntoTemplate,
7
7
  ssrRenderSinglePass,
8
8
  ssrStreamNavQueries
9
- } from "../shared/chunk-j9z9r179.js";
10
- import"../shared/chunk-szvdd1qq.js";
9
+ } from "../shared/chunk-c22cgv96.js";
10
+ import"../shared/chunk-bp1ez7v4.js";
11
11
  import"../shared/chunk-bt1px3c4.js";
12
12
  // src/prerender.ts
13
13
  async function discoverRoutes(module) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vertz/ui-server",
3
- "version": "0.2.49",
3
+ "version": "0.2.53",
4
4
  "description": "Vertz UI server-side rendering runtime",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -71,15 +71,15 @@
71
71
  "@ampproject/remapping": "^2.3.0",
72
72
  "@capsizecss/unpack": "^4.0.0",
73
73
  "@jridgewell/trace-mapping": "^0.3.31",
74
- "@vertz/core": "^0.2.48",
75
- "@vertz/ui": "^0.2.48",
74
+ "@vertz/core": "workspace:^",
75
+ "@vertz/ui": "workspace:^",
76
76
  "magic-string": "^0.30.0",
77
77
  "sharp": "^0.34.5"
78
78
  },
79
79
  "devDependencies": {
80
80
  "@happy-dom/global-registrator": "^20.8.3",
81
81
  "@playwright/test": "^1.58.2",
82
- "@vertz/codegen": "^0.2.48",
82
+ "@vertz/codegen": "workspace:^",
83
83
  "bun-types": "^1.3.10",
84
84
  "bunup": "^0.16.31",
85
85
  "happy-dom": "^20.8.3",