diff --git a/bun.lock b/bun.lock
index 0ef1257f..da13c51a 100644
--- a/bun.lock
+++ b/bun.lock
@@ -617,7 +617,7 @@
},
"packages/ui": {
"name": "@wrnexus/ui",
- "version": "0.8.17",
+ "version": "0.8.18",
"dependencies": {
"@wrnexus/core": "workspace:*",
},
diff --git a/packages/ui/components/textarea.wrn b/packages/ui/components/textarea.wrn
index 868f0819..026fa49b 100644
--- a/packages/ui/components/textarea.wrn
+++ b/packages/ui/components/textarea.wrn
@@ -46,7 +46,7 @@ size: string = "default"
{#if cornerHint}{cornerHint}{/if}
{#if icon}{/if}
-
+
{#if variant === "floating"}{label}{/if}
{#if helperText}{helperText}{/if}
diff --git a/packages/ui/package.json b/packages/ui/package.json
index dbbb621d..83e3f82c 100644
--- a/packages/ui/package.json
+++ b/packages/ui/package.json
@@ -1,6 +1,6 @@
{
"name": "@wrnexus/ui",
- "version": "0.8.17",
+ "version": "0.8.18",
"private": true,
"type": "module",
"main": "src/index.ts",
diff --git a/packages/ui/test/ui.test.ts b/packages/ui/test/ui.test.ts
index bd67d9a5..279035a9 100644
--- a/packages/ui/test/ui.test.ts
+++ b/packages/ui/test/ui.test.ts
@@ -26,6 +26,12 @@ test("bundled UI assets are discoverable and readable", () => {
expect(uiCss()).toContain("--wrn-");
});
+test("Textarea binds its value without rendering hydration markup as user content", () => {
+ const source = readFileSync(uiComponentPath("Textarea"), "utf8");
+ expect(source).toContain('value="{value}"');
+ expect(source).not.toContain(">{value}");
+});
+
test("global UI CSS stays below its migration ratchet", () => {
const css = uiCss();
// Component selectors belong to their owning .wrn files. Keep this asset to